CRC---迴圈冗餘校驗
阿新 • • 發佈:2018-11-19
typedef unsigned char uchar; typedef unsigned int uint; typedef unsigned short uInt16; uint crc; // CRC 碼 uint crc16l(uchar *ptr,uchar len) // ptr 為資料指標,len 為資料長度 { uInt16 i,j,tmp,CRC16; CRC16=0xffff; for (i=0;i<len;i++) { CRC16=*ptr^CRC16; for (j=0;j< 8;j++) { tmp=CRC16 & 0x0001; CRC16 =CRC16 >>1; if (tmp) CRC16=CRC16 ^ 0xa001; } *ptr++; } return(CRC16); }
(1)、預置1個16位的暫存器為十六進位制FFFF(即全為1),稱此暫存器為CRC暫存器;
(2)、把第一個8位二進位制資料(既通訊資訊幀的第一個位元組)與16位的CRC暫存器的低8位相異或,把結果放於CRC暫存器,高八位資料不變;
(3)、把CRC暫存器的內容右移一位(朝低位)用0填補最高位,並檢查右移後的移出位;
(4)、如果移出位為0:重複第3步(再次右移一位);如果移出位為1,CRC暫存器與多項式A001(1010 0000 0000 0001)進行異或;
(5)、重複步驟3和4,直到右移8次,這樣整個8位資料全部進行了處理;
(6)、重複步驟2到步驟5,進行通訊資訊幀下一個位元組的處理;
(7)、將該通訊資訊幀所有位元組按上述步驟計算完成後,得到的16位CRC暫存器的高、低位元組進行交換;
(8)、最後得到的CRC暫存器內容即為:CRC碼。
以上計算步驟中的多項式A001是8005按位顛倒後的結果。
---------------------
原文:https://blog.csdn.net/u010841212/article/details/41864659