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程式碼:
- unsigned long getCRC32( unsigned char* pBuf,unsigned long len)
- {
- static unsigned long crcTable[256];
- static unsigned char isInit;
- unsigned long poly;
- int i, j;
- register unsigned long crc;
- if(isInit==0)
- {
- isInit = 1;
- poly = 0xEDB88320L;
- for (i=0; i<256; i++) {
- crc = i;
- for (j=8; j>0; j--) {
- if (crc&1) {
- crc = (crc >> 1) ^ poly;
- } else {
- crc >>= 1;
- }
- }
- crcTable[i] = crc;
- }
- }
- int c;
- crc = 0xFFFFFFFF;
- i=0;
- while(len--) {
- c = pBuf[i];
- i++;
- crc = ((crc>>8) & 0x00FFFFFF) ^ crcTable[ (crc^c) & 0xFF ];
- }
- return( crc^0xFFFFFFFF );
- }