CRC校验算法——以CRC8(X^8+X^2+X+1)为例

前言

RM裁判系统串口通信的帧头用了CRC8校验,借此机会研究了一下CRC校验的原理。 本文以上述帧头作为例子,讲解CRC8(X8+X2+X+1)校验码的生成方法。

帧头定义如图所示: 由图可知: 帧头的数据位总共是4个字节,即32bit; 校验位是1个字节,即8bit。 要从这4字节的数据位生成1字节的CRC校验码。

步骤

设数据位如下: 1.起始字节:0xA5 2.数据长度:0x0002 3.包序号:0x01 连起来就是: A5000201(Hex) = 10100101 00000000 00000010 00000001(Bin)

总的来说CRC码生成过程就两步: 1.向左移位 2.模2除法(后面细讲)

这里面要确定2个量: 1.左移的位数 2.模2除法时的除数

使用提供的CRC计算器计算得到A5000201的CRC8校验码为0x9C=10011100(Bin) 所以,下面的计算过程将详细解释如何得到这个校验码。

步骤1:向左移位

该校验码为8位,因此移位位数=8 向左移8位,得到 10100101 00000000 00000010 00000001 00000000(Bin) = A500020100(Hex)

步骤2:模2除法

用步骤1中移位后的数据位除以一个常数。 本例中的常数为0x107。 即用0xA500020100除以0x107。 模2除法也是除法的一种。 事实上,每一种CRC校验码都有一个对应的常数作为除数。如下表所示: 最右边一列为除数。 下面是模2除法的过程: 模2除法的规则简单来说,就是, 被除数最高位是1,商就是1;最高位是0,商就是0。 设被除数为A(不是指完整的被除数,而是做竖式运算时的8bit数), 商X除数=B(A和B均为8bit数) 则每次用A减去B时(和普通除法竖式运算一样,这一步是为了得到余数),使用不带进位的二进制减法——等价于将A和B异或 如果没看懂可以看或 其余的操作和普通除法竖式运算一样。 模2除法运算最终得到一个8bit的余数。这个余数就是我们所求的CRC校验码。 本例中求得的CRC码=0x9C=10011100(Bin)

这里再贴一个模2除法的例子:

CRC码生成算法代码

待更

经验分享 程序员 微信小程序 职场和发展