CRC冗餘校驗碼的介紹和實現

weixin_34377065發表於2013-08-06

from:http://yoyo.play175.com/p/200.html

節選至百度百科:

首先,任何一個由二進位制數位串組成的程式碼,都可以惟一地與一個只含有0和1兩個係數的多項式建立一一對應的關係。例如,程式碼1010111對應的多項式為X^6+X^4+X^2+X+1(這裡的X^n表示x的n次方)。同樣.多項式X^5+X^3+X^2+X+1對應的程式碼為101111。CRC碼在傳送端編碼和接收端校驗時,都可以利用事先約定的生成多項式G(X)來得到。目前廣泛使用的生成多項式主要有以下四種:
CRC12=X^12+X^11+X^3+X^2+1
CRC16=X^16+X^15+X^2+1(IBM公司)
CRC16=X^16+X^12+X^5+1(國際電報電話諮詢委員會CCITT)
CRC32=X^32+X^26+X^23+X^22+X^16+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X+1
冗餘碼的計算方法是,先將資訊碼後面補0,補0的個數是生成多項式最高次冪;將補零之後的資訊碼用模二除法(非二進位制除法)除以G(X)對應的2進位制碼,注意除法過程中所用的減法是模2減法,即沒有借位的減法,也就是異或運算。當被除數逐位除完時,得到比除數少一位的餘數。此餘數即為冗餘位,將其新增在資訊位後便構成CRC碼字。
例如,假設資訊碼字為11100011,生成多項式G(X)=X^5+X^4+X+1,計算CRC碼字。
G(X) = X^5+X^4+X+1,也就是110011,因為最高次是5,所以,在資訊碼字後補5個0,變為1110001100000。用1110001100000模二除法除以110011,餘數為11010,即為所求的冗餘位。
因此傳送出去的CRC碼字為原始碼字11100011末尾加上冗餘位11010,即 1110001111010。接收端收到碼字後,採用同樣的方法驗證,即將收到的碼字用模二除法除以110011(是G(X)對應的二進位制生成碼),發現餘數是0,則認為碼字在傳輸過程中沒有出錯。

附獲得CRC32的C程式碼:

  1. unsigned long getCRC32( unsigned char* pBuf,unsigned long len) 
  2.     static unsigned long crcTable[256]; 
  3.     static unsigned char isInit; 
  4.     unsigned long poly; 
  5.     int i, j; 
  6.  
  7.     register unsigned long crc; 
  8.  
  9.     if(isInit==0) 
  10.     { 
  11.         isInit = 1; 
  12.         poly = 0xEDB88320L; 
  13.         for (i=0; i<256; i++) { 
  14.             crc = i; 
  15.             for (j=8; j>0; j--) { 
  16.                 if (crc&1) { 
  17.                     crc = (crc >> 1) ^ poly; 
  18.                 } else { 
  19.                     crc >>= 1; 
  20.                 } 
  21.             } 
  22.             crcTable[i] = crc; 
  23.         } 
  24.     } 
  25.  
  26.     int c; 
  27.     crc = 0xFFFFFFFF; 
  28.     i=0; 
  29.     while(len--) { 
  30.         c = pBuf[i]; 
  31.         i++; 
  32.         crc = ((crc>>8) & 0x00FFFFFF) ^ crcTable[ (crc^c) & 0xFF ]; 
  33.     } 
  34.     return( crc^0xFFFFFFFF ); 

 

相關文章