观察:CRC校验详解

2023-04-21 08:25:45    来源 : 面包芯语

关注+星标公众号,不错过精彩内容!


(资料图片仅供参考)

1、CRC简介

CRC 是Cyclic Redundancy Check的缩写,循环冗余校验,用于校验数据传输的完整性。一般情况下在数据发送前计算CRC校验值,附在发送数据之后,数据接收方也按照同样方法计算CRC,然后对比计算结果,如果一致说明数据数据传输无误,否则数据传输出错。

2、什么是模二运算

CRC计算采用二进制模二除法,来解释一下模二运算,模二运算忽略进位和借位,下面一一解释。

1)模二加法,类似异或运算

1+1=0 0+0=0

1+0=1 0+1=1

2)模二减法,类似异或运算

1-1=0 0-0=0

1-0=1 0-1=1

3)模二乘法

1×1=1 0×0=0

1×0=0 0×1=0

4)模二除法

模二除法和十进制除法类似,运用了模二乘法和模二减法,直接举例说明。

3、常见CRC模型如下:

不同的多项式计算方法不同,下面以CRC-5/EPC举例说明:

多项式公式:x5 + x3 + 1

完整写出来是x5+ 0*x4 + x3 +0*x2+ 0*x +1

多项式:取以上多项式中的系数101001为多项式,一般最高位不写出来,所以多项式是01001,即0x09

初始值:运算的初始值,EPC要求是0x09

结果异或值:所有数据计算完的结果与其异或,EPC这里是0

输入反转:输入数据每字节高低位是否翻转,EPC不翻转。

输出反转:输出结果高低位是否翻转,EPC不翻转。

4、手撕CRC

仍然以CRC-5/EPC举例,计算字节0xAA的CRC值,这是一个5位的CRC,使用模二除法,最终计算出5位CRC校验值。被除数是0xAA,二进制10101010,除数是多项式,即101001。计算过程如下图所示,为了表明计算过程把商为0的计算过程也写出来了。这是5位CRC,只取最后5位,即10000。输出结果不需要异或也不需要反转,所以10000就是计算结果。

两个字节AA55的CRC计算过程,同样为了表明计算过程把商为0的计算过程也写出来了。这是5位CRC,只取最后5位,即01000。输出结果不需要异或也不需要反转,所以01000就是计算结果。

再举一个例子,仍然计算0xAA的CRC。这次采用模型CRC-5/USB,多项式:x5+x2+1,输入输出数据都反转,多项式0x05,初始值为0x1F,输出异或值为0x1F。最终计算结果00111。

5、C语言实现

以下是CRC-5/EPC的C语言实现代码:

标签:

相关推荐

x 广告

如有意见请与我们联系 邮箱:8 97 180 9 @qq.com

豫ICP备2021032478号-31

Copyright ©  2015-2022 元宇宙版权所有