CRC 即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验
码,其特征是信息字段和校验字段的长度可以任意选定。
CRC 校验可以简单地描述为:例如我们要发送一些数据(信息字段),为了避免一些干扰以及
在接收端的对读取的数据进行判断是否接受的是真实的数据,这时我们就要加上校验数据(即 CRC
校验码),来判断接收的数据是否正确。在发送端,根据要传送的 k 位二进制码序列,以一定的规
则(CRC 校验有不同的规则。这个规则,在差错控制理论中称为“生成多项式”。)产生一个校验用
的 r 位校验码(CRC 码),附在原始信息后边,构成一个新的二进制码序列数共 k+r 位,然后发送出去。
在接收端,根据信息码和 CRC 码之间所遵循的规则(即与发送时生成 CRC 校验码相同的规则)进
行检验,校验采用计算机的模二除法,即除数和被除数(即生成多项式)做异或运算,进行异或运
算时除数和被除数最高位对齐,进行按位异或运算,若最终的数据能被除尽,则传输正确;否则,
传输错误。
CRC8 即最终生成的 CRC 校验码为 1 字节,其生成多项式,生成多项式为 g(x)=x
8
+x
5
+x
4
+1,相
当于 g(x)=1·x
8
+0·x
7
+0·x
6
+1·x
5
+1·x
4
+0·x
3
+0·x
2
+0·x
1
+1·x
0
,即对应的二进制数为 100110001。
CRC8 校验算法:
1.CRC8 校验的一般性算法:
例如: 信息字段代码为: 00000001 00000010 ———— 对应 m(x)=x
8
+x
生成多项式为:g(x)=x
8
+x
5
+x
4
+1 ———— 对应 g(x)的二进制代码为:
100110001
现在我们将要对 2 字节数据 0x0102 生成 CRC8 校验码,并最终将生成的 1 字节 CRC 校验码跟
在 0x0102 的后面,即 0x01 02 ##,( ##即 8 为 CRC 码),最终生成的 3 字节数据就是经 CRC8
校验生成的数据。
先计算 x
8
m(x)=x
16
+x
9
,对应的 2 进制数为:100000010 00000000 。可以看到这样运算所得到
的结果其实就是将信息字段代码的数左移 8 位。因为最终要将生成的 8 位 CRC8 校验码附在信息字
段的后面,所以要将信息字段的数左移 8 位。最后用 x
8
m(x)得到的二进制数对生成多项式 g(x)进行
模二运算,最终的余数(其二进制数的位数一定比生成多项式 g(x)的位数小)就是所要的 CRC8 校
验码。
100000010 00000000
^ 100110001
---------------------------
000110011 00000000
^ 100110 001
---------------------------
010101 00100000
^ 10011 0001
---------------------------
00110 00110000
^ 100 110001
---------------------------
010 11110100
^ 10 0110001
---------------------------
00 10010110
对 x
8
m(x)做模二运算取余得 10010110(0x96),这个 8 位的二进制数就是 CRC8 校验码。所
以,经 CRC8 校验后研发送的数据就是 0x010296。