CRC校验(CRC-32 CRC-8...)

Posted on 2019-08-14 09:28  橙子j  阅读(3364)  评论(0编辑  收藏  举报

CRC-32在线校验网址:(以下都可以)

https://crccalc.com/

http://www.sunshine2k.de/coding/javascript/crc/crc_js.html

https://www.lammertbies.nl/comm/info/crc-calculation.html

 

CRC即循环冗余校验(Cyclic Redundancy Check),CRC是一种常用的检错码,并不能用于自动纠错

 

CRC码校验原理:

发送端:发送端根据信息字段与生成多项式生产呢个CRC码,CRC码作为数据发送给接收端,同时也会把计算出的校验字段的数据一同发送(注:目的是如果接受端检测到发送的数据是正确的,接收端能够从CRC码中提取出信息字段的数据)。

接收端:接收到CRC码数据后,检测接收到的数据是否正确,方法:将CRC码数据与生成多项式进行模2除,如果余数为0,则说明接收到的数据是正确的。然后,从CRC码中提取出信息字段的数据。

 

发送端生成CRC码方法:

CRC码是由两部分组成的,前部分是信息字段,就是需要校验的信息,后部分是校验字段,如果CRC码共长n个bit,信息字段长k个bit,就称为(n,k)码。它的编码规则是:

  1. 首先将信息字段值(k bit)左移r位(k+r=n)
  2. 运用一个生成多项式g(x) (也可看成二进制数) 模2,除上面的式子,得到的余数就是校验字段值。模2运算实际上是按位异或(Exclusive OR)运算,即相同为0,相异为1,也就是不考虑进位、借位的二进制加减运算。
  3. 生成的CRC码值为:信息字段值+校验字段值(单位:位bit,次序:高位到低位),例如字段值为1001,校验字段值为110,则CRC码为1001110

 

常见的多项式:

CRC8=X8+X5+X4+1

CRC-CCITT=X16+X12+X5+1

CRC16=X16+X15+X5+1

CRC12=X12+X11+X3+X2+1

CRC32=X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+1

如CRC8对应代码:100110001

 

下面是看起来复杂,其实就是套公式的数学公式计算方法:

设待校验的信息码有k位,即:m = (mk-1mk-2mk-3……m1m0), 多项式m(x)可表示为
m(x) = mk-1xk-1+ mk-2xk-2 +……m1x1+ m0x0   ----------------------------------------------------------------- 式(1)
用多项式g(x)的最高次幂R对应的X乘以m(x),将得到式(2)
Xm(x) = mk-1xk+R-1+ mk-2xk+R-2 +……m1x1+R+ m0x0+R -----------------------------------------------------式(2)
将Xm(x) 模2除以g(x),得到多项式商为A(x),余数为r(x),即:
A(x)g(x) = Xm(x) +r(x) ------------------------------------------------------------------------------------------式(3)
余数多项式r(x)可表示为
r(x) = rR-1xR-1+ rR-2xR-2 +……r1x1+ r0x------------------------------------------------------------------------式(4)
将式(2)和式(4)代入式(3)得
A(x)g(x) = mk-1xk+R-1+ mk-2xk+R-2 +……m1x1+R+ m0x0+R  rR-1xR-1+ rR-2xR-2 +……r1x1+ r0x0   ---------式(5)
式(5)对应的码组为K+R位,即:
N = (mk-1+ mk-2 +……m1+ m0  rR-1+ rR-2 +……r1+ r0) ------------------------------------------------------式(6)
从M到N就是CRC的编码过程mk-1+ mk-2 +……m1+ m0  为K位信息码rR-1+ rR-2 +……r1+ r0为R位校验码
 

信息接收端,将接受到的K+R位码除以相同的多项式g(x),根据式(3)所产生的余数为0,则接受到的数据信息正确无误,否则则认为信息在传输过程中产生的误码。
根据式(1)~式(6),CRC编码必须进行模2除运算,CRC的校验位就是模2除得到的余数,如果余数用寄存器的存数表示,模2除用异或门表示,那么通用的CRC串行电路就可以同图6.2所示的电路来实现。

 

参考:https://blog.csdn.net/u013898698/article/details/78864161

https://blog.csdn.net/android_mnbvcxz/article/details/78902737