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码生成算法代码
待更
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
