天天看点

全面分析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),若相等则通过,否则失败。

本文来自: 中国自学编程网(

www.zxbc.cn

) 详细出处参考:

http://zxbc.cn/html/20070604/21075_5.html

继续阅读