赞
踩
校验多项式是:g(x) = X^8 + X^5 + X^4 + 1
需要校验的数据是:0x0102
校验多项式 g(x)
对应的二进制为 1 0011 0001
,即 0x131
因为需要 8 位 CRC 校验,所以将需要校验的数据左移 8 位,得到:0000 0001 0000 0010 0000 0000
将步骤 2 中左移后的数中最高位的 0
全部去掉,得到:1 0000 0010 0000 0000
将步骤 3 中的结果按高位对齐的方式和校验多项式的二进制数进行异或运算:(低位不够补0)
1 0000 0010 0000 0000
1 0011 0001 0000 0000
// 异或
————————————————————
0 0011 0011 0000 0000
将步骤 4 中结果的最高位 0
全部去掉,得到:11 0011 0000 0000
将步骤 5 中结果按高位对齐的方式和校验多项式二进制数进行异或运算:(低位不够补0)
11 0011 0000 0000
10 0110 0010 0000
// 异或
————————————————————
01 0101 0010 0000
7. 重复步骤 5-6,直到最终结果只剩下 8 位:
1 0101 0010 0000
1 0011 0001 0000
// 异或
————————————————————
0 0110 0011 0000
100 1100 0100
// 异或
————————————————————
010 1111 0100
10 0110 0010
// 异或
————————————————————
00 1001 0110
8. 校验结果为:1001 0110
,即 0x96
1. 写下这篇文章的缘由是用stm32驱动mlx90614温度传感器时,SMBus中线中有这个校验;
2. 任意字节数,经过CRC校验后的结果位数和CRC多项式二进制值相同。比如上面的例子,不管输入的传输的数是 0x0102 还是 0x01020304 ,结果都是 8 位的二进制值;
3. 校验码在线计算工具:CRC(循环冗余校验)在线计算_ip33.com
从上图可以看到,有很多参数模型可以选择:对于CRC8,就有四种:CRC-8,CRC-8/ITU,CRC-8/ROHC,CRC-8/MAXIM。
这四种都有什么区别呢?我们可以选择相应的参数模型后对比后面的参数差异。
这里主要解释一下,各个参数的意义:
1. 宽度:即CRC多项式中最高次的指数。比如上面例子中的宽度就是 8 ;
2. 多项式POLY:即多项式的二进制值(省略最高位,从上面的例子可以看到,最高位的结果一直是零)。上面的例子是 07 ;
3. 初始值:CRC的初始值。(常见的初始值都为 0,但有的初始值全为 1,当初始值不为 0 时,传输 0x20 和 传输 0x0020 的校验结果是一样的,
所以初始值不为 0 是为了检测出传输数据前面的 0 的个数不出错。)(说了这么多,我也不知道怎么个不为 0 法。。。)
4. 结果异或值:这个很简单,就是对前面得出的结果再次和指定值进行一次异或。默认为 全0,任何数和 0 异或后结果不变。
5. 输入数据反转:在进行所有计算之前,把输入数据按位反转所有位。假设上面的输入框写的是 “80 40”,则实际上是对 “01 02” 计算的校验码。
6. 输出数据反转:在对结果进行结果异或值运算之前,按位反转所有位。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。