CRC校验是编程中使用比较多的一种检验方式,包括CRC8, CRC16, CRC32校验等。校验长度越长,校验所需要的时间越久。为了缩短计算时间,CRC校验又分为直接计算法和查表计算法。

直接计算是一种按位计算方法,其计算原理如下:

假定有待校验数据A = 1101,校验多项式B = 0000 0111,当前CRC校验值 CRC = 1011 1001, 期待结果C。则计算过程如下:

步骤0:CRC = 1011 1001 首先与数据A左移4位后异或得到新CRC1 =  1011 1001^1101 0000 = 0110 1001;

步骤1:CRC1 首位为0, CRC1左移1位得 CRC2 = 1101 0010;

步骤2:CRC2首位为1, CRC2左移1位得 CRC3 = 1010 0100, 然后CRC2与校验多项式B异或得 CRC4 = 1010 0100 ^ 0000 0111= 1010 0011;

步骤3:CRC4首位为1, CRC4左移1位得CRC5 = 0100 0110, 然后CRC4与校验多项式B异或得 CRC6 = 0100 0110^ 0000 0111 = 0100 0001;

步骤4:CRC6首位为0, CRC6左移1位得CRC7 = 1000 0010;

至此,4位宽度计算完成。

从以上过程可以看出,步骤1到步骤4的执行过程与步骤0所得的结果CRC1的高4位非常相关,该高4位取值直接决定了步骤1到步骤4的运行结果;

进一步将CRC1划分为CRC1 = (0110 0000)^(0000 1001);

则结果就可以写成如下:

C =  (0110 0000)^(0000 1001)^(一系列校验多项式因CRC1高4位取值变化后的多项式)

备注1:步骤0-步骤4中的CRC值左移操作可以认为 是CRC值不变,校验多项式随CRC1高4位取值不同进行变换。

因此,又可以根据CRC1的高4位取值与校验多项式预先生成一张2^4的码表,在实际计算的时候直接取CRC1的低4位(1001)与对应的码值异或,这样来大大加速计算,又称为查表法。依据每次计算位宽度的不同,可以预先计算出2^4,2^8个码值,常用是按照字节计算,则预先准备好2^8个码值。码值的位数则随使用的CRC校验宽度变化。

备注2:实际计算中,校验是从高位向低位,因此,CRC1的低4位(1001)会左移4位,如果在CRC8的校验当中。同理,CRC16校验会左移8位(采用8位宽度校验),CRC32校验会左移24位(采用8位宽度校验)。

备注3:如果校验中,存在位反转操作,则需要对输入数据进行位反转操作。

备注4:

参考文章链接


http://wenku.baidu.com/link?url=WFR4z3kwsTcvaV5u-VndtVu1KhGDAWdUhO8_0wG09o9OzHrV72KmYq9pN1fHjSKw4v1UN8NqSvBKR66g2TvQIrTe6aFfnBGgJy0baTmEbh_

http://www.xjtudll.cn/Exp/273/