当前位置:   article > 正文

CRC-8 原理_crc8

crc8

CRC-8 校验

假设:

  1. 校验多项式是:​g(x) = X^8 + X^5 + X^4 + 1

  2. 需要校验的数据是:0x0102

计算过程:

  1. 校验多项式 g(x) 对应的二进制为 1 0011 0001 ,即 0x131

  2. 因为需要 8 位 CRC 校验,所以将需要校验的数据左移 8 位,得到:0000 0001 0000 0010 0000 0000

  3. 将步骤 2 中左移后的数中最高位的 0 全部去掉,得到:1 0000 0010 0000 0000

  4. 将步骤 3 中的结果按高位对齐的方式和校验多项式的二进制数进行异或运算:(低位不够补0)

              1 0000 0010 0000 0000

              1 0011 0001 0000 0000          // 异或

                          ————————————————————

              0 0011 0011 0000 0000

  5. 将步骤 4 中结果的最高位 0 全部去掉,得到:11 0011 0000 0000

  6. 将步骤 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. 输出数据反转:在对结果进行结果异或值运算之前,按位反转所有位。

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/112990
推荐阅读
相关标签
  

闽ICP备14008679号