1. 程式人生 > >CRC---迴圈冗餘校驗

CRC---迴圈冗餘校驗

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