result = ~crcGetRegisters();
// 填寫FCS,先低後高
ppp[11] = result & 0xff;
ppp[12] = (result >> 8) & 0xff;
/////////// 以下驗證FCS
// 初始化
crcInitRegisters();
// 逐位輸入,每個位元組低位在先,包括兩個FCS位元組
for(i = 0; i < 13; i++)
{
for(j = 0; j < 8; j++)
{
crcInputBit((ppp[i] >> j) & 1);
}
}
// 得到驗證結果
result = crcGetRegisters();
可以看到,計算出的CRC等于0x3AD0,與原來的FCS相同。驗證結果等于0。初始化為全"1",以及将寄存器組的值求反得到CRC,都是CRC-ITU的要求。事實上,不管初始化為全"1"還是全"0",計算CRC取反還是不取反,得到的驗證結果都是0。
4 位元組型算法
比特型算法逐位進行運算,效率比較低,不适用于高速通信的場合。數字通信系統(各種通信标準)一般是對一幀資料進行CRC校驗,而位元組是幀的基本機關。最常用的是一種按位元組查表的快速算法。該算法基于這樣一個事實:計算本位元組後的CRC碼,等于上一位元組餘式CRC碼的低8位左移8位,加上上一位元組CRC右移8位和本位元組之和後所求得的CRC碼。如果我們把8位二進制序列數的CRC(共256個)全部計算出來,放在一個表裡 ,編碼時隻要從表中查找對應的值進行處理即可。
CRC-ITU的計算算法如下:
a.寄存器組初始化為全"1"(0xFFFF)。
b.寄存器組向右移動一個位元組。
c.剛移出的那個位元組與資料位元組進行異或運算,得出一個指向值表的索引。
d.索引所指的表值與寄存器組做異或運算。
f.資料指針加1,如果資料沒有全部處理完,則重複步驟b。
g.寄存器組取反,得到CRC,附加在資料之後。
CRC-ITU的驗證算法如下:
e.資料指針加1,如果資料沒有全部處理完,則重複步驟b (資料包括CRC的兩個位元組)。
f.寄存器組的值是否等于“Magic Value”(0xF0B8),若相等則通過,否則失敗。
本文來自: 中國自學程式設計網(
www.zxbc.cn) 詳細出處參考:
http://zxbc.cn/html/20070604/21075_5.html