天天看點

全面分析CRC算法

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),若相等則通過,否則失敗。

繼續閱讀