赞
踩
CRC 算法的基本思想是将传输的数据当做一个位数很长的数。将这个数除以另一个数。得到的余数作为校验数据附加到原数据后面。CRC算法中,将二进制数据流作为多项式的系数,然后进行的是多项式的乘除法。
如:
除法其实做的是异或运算,可以更简便的用表格表示,假设生成项为10011
转化为电路:
数据从低位输入,若最高位数据为0则寄存器移位,若最高位数据为1则生成项与寄存器中的值异或后寄存器移位。因此,在生成项为10011时,待测数据移位一次结果如图所示:
但是这种方法每次只能计算1bit数,效率太低
我们把计算过程加长,计算4次后,寄存器中数据如图所示:
由此,可根据移位n次后寄存器中的数据与输入数据的关系,带入公式直接得到计算n次的CRC结果
注意:
对于一个1bit数a来讲,a^a=0,0^a=a
随着计算数据量的增加,上图方格中的数据量会成指数增长,因此需要去冗余。
对于dn,如果出现的次数为偶数,则删除;如果出现的次数为奇数,则保留;最后将方格中剩余的数相互异或。
对于CRC32,有固定的参数模型。
Name:”CRC-32”
Width:32
Poly:04C11DB7
Init:FFFFFFFF
RefIn:True
RefOut:True
XorOut:FFFFFFFF
Check:CBF43926
其中,Width表示CRC比特数。
Poly为32位生成项。
Init为算法开始时寄存器的初始化预置值,用十六进制表示。
RefIn若为False表示待测数据的每个字节都不用“颠倒”,若为True表示待测数据的每个字节在计算前都需要先“颠倒”,即字节顺序不用颠倒,但是每个字节内部的比特需要颠倒。如待处理数据为0x31 32 33 34,颠倒后为0x8C 4C CC 2C。
RefOut若为False表示计算结束后寄存器中的值直接进入XorOut即可,若为True,表示计算结束后整个寄存器中的值先颠倒再进入XorOut处理。如寄存器中的值为0x31 32 33 34,颠倒后的值为0x2C 22 4C 8C.
XorOut为十六进制数,该值与RefOut输出的值进行异或,即可得到最终CRC值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。