其中 為整數(shù), 為16位二進(jìn)制余數(shù)。將式(3-3)代入式(3-2)得:
(3-4)
再設(shè): (3-5)
其中 為整數(shù), 為16位二進(jìn)制余數(shù),將式(3-5)代入式(3-4),如上類推,最后得到:
(3-6)
根據(jù)CRC的定義,很顯然,十六位二進(jìn)制數(shù) 既是我們要求的CRC碼。
式(3-5)是編程計(jì)算CRC的關(guān)鍵,它說明計(jì)算本位后的CRC碼等于上一位CRC碼乘以2后除以多項(xiàng)式,所得的余數(shù)再加上本位值除以多項(xiàng)式所得的余數(shù)。由此不難理解下面求CRC碼的C語言程序。*ptr指向發(fā)送緩沖區(qū)的首字節(jié),len是要發(fā)送的總字節(jié)數(shù),0x1021與多項(xiàng)式有關(guān)。
unsigned int cal_crc(unsigned char *ptr, unsigned char len) {
unsigned char i;
unsigned int crc=0;
while(len--!=0) {
for(i=0x80; i!=0; i/=2) {
if((crc&0x8000)!=0) {crc*=2; crc^=0x1021;} /* 余式CRC乘以2再求CRC */
else crc*=2;
if((*ptr&i)!=0) crc^=0x1021; /* 再加上本位的CRC */
}
ptr++;
}
return(crc);
}
按位計(jì)算CRC雖然代碼簡單,所占用的內(nèi)存比較少,但其最大的缺點(diǎn)就是一位一位地計(jì)算會占用很多的處理器處理時(shí)間,尤其在高速通訊的場合,這個(gè)缺點(diǎn)更是不可容忍。因此下面再介紹一種按字節(jié)查表快速計(jì)算CRC的方法。
4 按字節(jié)計(jì)算CRC
不難理解,對于一個(gè)二進(jìn)制序列數(shù)可以按字節(jié)表示為式(4-1),其中 為一個(gè)字節(jié)(共8位)。
(4-1)
求此二進(jìn)制序列數(shù)的CRC碼時(shí),先乘以 后(既左移16位),再除以多項(xiàng)式G(X),所得的余數(shù)既是所要求的CRC碼。如式(4-2)所示:
(4-2)





