赞
踩
1.先举两个个例子,使用XOR除法(请注意当异或结果首位为0时,除数全部变为0)
接下来数据1111后面加上110变成1111110就可以被1001使用异或除法除尽。
所以我们想要发送二进制数据只要在数据后面加上(除数位数-1)个0,再用除数进行异或除法就可以得到余数,这个得到的余数就是CRC
对于除数(如上为1001),我们称为生成多项式或生成项或poly。
2.生成项
生成项的最高位在每次除法过后,相关余数结果都会被消掉,所以不重要
生成项的最低位必须为1,这是规定。
生成项写成多项式(以一种CRC32为例):
写成16进制(一般不写最高位1)为0x04C11DB7
3、计算方法
CRC可以像上面描述的那样计算,但效率很低。还有一种驱动表法速度较快,如下,
由于异或除法遵循交换律即(a XOR b) XOR c = a XOR (b XOR c),所以可以poly先和poly进行异或运算,但要注意移位
例
上图的正常流程除法和下图可以得到相同的结果
所以我们为了一次运算移除四位可以根据被除数的前四位让除数预先进行相互异或运算。由于移除的4位有16种可能,所以除数的异或运算也对应有16种,由此可列出一个表格,以完成一次运算移除四位的操作。
同理,想一次移除8位则表格会变成256个表值。CRC16和CRC32都是一次移除一个字节即8位的。
4.CRC其他参数 例:
name:名称
width:crc的bit位数,即生成项位数减1,例CRC32中 width就是32
poly:生成项简写,忽略了最高位1
init:十六进制表示,初始化预置值,在运算开始前其用来和待测数进行XOR运算
refin:ture表示输入值最左边的bit7位是最低位即MSB在右边LSB在左,false表示MSB在左LSB在右
refout:true表示输出的LSB在左MSB在右,false相反
XOROUT: 计算的结果最后经过和XOROUT值的异或运算再输出。
check:校验最后输出的值和Check值是否一致
更多请看文档 https://wenku.baidu.com/view/fb791c0203d8ce2f006623f5.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。