N位元組CRC冗餘校正

來源:互聯網
上載者:User

/**********************************************************************************************<br />CRC16-CCITT檢驗 產生多項式:x16+x15+x2+1<br />利用位元組型演算法,對N位元組進行CRC16-CCITT校正。<br />BY: SYSU-LXIONGH<br />位元組型演算法的一般描述為:本位元組的CRC碼,等於上一位元組CRC碼的低8位<br />左移8位,與上一位元組CRC右移8位同本位元組異或後所得的CRC碼異或。<br />位元組型具體演算法如下:<br /> 1)CRC寄存器組初始化為全"0"(0x0000)。(注意:CRC寄存器組初始化全為1時,最後CRC應取反。)<br /> 2)CRC寄存器組向左移8位,並儲存到CRC寄存器組。<br /> 3)原CRC寄存器組高8位(右移8位)與資料位元組進行異或運算,得出一個指向值表的索引。<br /> 4)索引所指的表值與CRC寄存器組做異或運算。<br /> 5)資料指標加1,如果資料沒有全部處理完,則重複步驟2)。<br /> 6)得出CRC。</p><p>1個Byte(0~255)的CRC16-CCITT校正碼的產生方法為位元型演算法,可產生位元組型演算法所需要的表<br />位元型具體演算法如下:<br />1)將擴大後的資料流(2位元組)高8位(BYTE)放入一個長度為16的寄存器;<br />2)如果寄存器的首位為1,將寄存器左移1位(寄存器的最低位從下一個位元組獲得),再與產生多項式的簡記式異或;<br /> 否則僅將寄存器左移1位(寄存器的最低位從下一個位元組獲得);<br />3)重複第2步,直到資料流(2位元組)全部移入寄存器;<br />4)寄存器中的值則為CRC校正碼<br />**********************************************************************************************/<br />unsigned short MkCRC_16(unsigned char *pData,unsigned short *pTable/*CRC檢驗表指標*/,int length)<br />{//計算資料流*pData的CRC16-CCITT校正碼,長度為length<br />unsigned short CRC_16 = 0x0000; //初始化為0<br />while(length>0)<br />{<br />CRC_16 = (CRC_16<<8)^(pTable[((CRC_16>>8)^*pData)&0XFF]);<br />length --;<br />pData ++;<br />}<br />return CRC_16;<br />}<br />void MkCRC_16Table(unsigned short *pTable)<br />{//動態產生1位Byte的CRC16-CCITT校正碼<br />unsigned short byteCRC = 0x0000;<br />int i,j,k;<br />for(i=0,k=0;i<=255;i++,k++)<br />{<br />byteCRC = (i<<8);<br />for(j=8;j>0;j--)<br />{<br />if(byteCRC&0x8000) //如果最高為1<br />{<br />byteCRC = (byteCRC<<1)^0x11021;<br />}<br />else<br />{<br />byteCRC >>= 1;<br />}<br />}<br />pTable[k] = byteCRC;<br />}<br />}<br />int main()<br />{//測試代碼<br />unsigned short CRC_16_BYTE_TABLE[255];<br />MkCRC_16Table(CRC_16_BYTE_TABLE);<br />unsigned char testData[] = {1,2,3,4,5,6,7,8,9,10};<br />unsigned short CRC_16 = 0x0000;<br />CRC_16 = MkCRC_16(testData,CRC_16_BYTE_TABLE,10);<br />std::cout<<"{1,2,3,4,5,6,7,8,9,10}/n";<br />//std::cout<<CRC_16<<std::endl;<br />for(int num=15;num>=0;num--)<br />{<br />std::cout<<((CRC_16>>num)&0x0001);<br />}<br />std::cout<<std::endl;<br />return 0;<br />} 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.