全网最详细的CRC讲解即计算

CRC

循环冗余码(Cyclic Redundancy Code, CRC)是一种用于校验通信链路上数字传输准确性的计算方法(通过某种数学运算来建立数据位和校验位(CRC)的约定关系的)。它是利用除法以及余数的原理来作错误侦测。
发送方: 使用某公式计算出被传送数据所含信息的一个值,并将此值 附在被传送数据后。
接收方: 对同一数据进行相同的计算,应该得到相同的结果。对比CRC结果。

数学背景

模二运算

模二运算,是一种二进制的四则运算,包括模二加(+)、模二减(-)、模二乘(x)、模二除(/) 四种二进制运算。与四则运算不同的是模二运算不考虑进位和借位.
模二除法

重点

  1. 模二加法和模二减法的结果是相同的,并且与异或(XOR)运算的结果是一致的。 异或运算可以代替模二加减运算。可用硬件XOR异或门硬件代替运算。
  2. 模二乘法可看作两个步骤, 可用AND与门代替运算。
    a. 第一步被乘数的位跟乘数进行与运算,再根据被乘数的阶进行左移被乘数的阶数位,被乘数的位数对应n个部分积。
    b. 部分积进行模二加法运算。
  3. 模二乘除法与普通乘除法一样演算,区别是模二除法的被除数部分的阶数与除数P的阶数相同时,进行部分XOR异或运算,得到商数和余数,将余数的阶数与除数P循环计算,直到余数的阶数小于R,这个余数就是附加的校验码。
    关注模二除法,因为它与CRC算法密切相关,它有三个性质:
  4. 当最后余数的位数小于除数位数时,除法停止。
  5. 当被除数的位数小于除数位数时,则商数为0,被除数就是余数。
  6. 只要被除数或部分余数的位数与除数一样多,且最高位为1,不管其他位是什么数,皆可商1。

二进制多项式

对任意的二进制数都构造与其对应的一个二进制系数多项式
例如:10011B,其对应的二进制系数多项式为P(X) = X^4 +X +1。
CRC算法中,对于二进制数都是以二进制系数多项式去描述的,。
在这里插入图片描述

CRC算法

CRC 算法的基本思想是将要传输数据后面填充N个0(既是传输数据信息左移N位)当做一个包含数据的多项式。将左移后的数据多项式 模二除以另一个生成多项式(Poly),得到的余数作为(CRC)校验数据附加到原数据后面。(模二除,CRC取余)
在这里插入图片描述
在这里插入图片描述

g(x)为校验码的生成多项式(上文中,除数的二级制多项式poly),不同的位数的CRC多项式,对应生成多项式的次幂不同,其纠错能力也不同。常见的标准多项式如下。
在这里插入图片描述

CRC-8算法为例,该算法生成多项式G(X)为在这里插入图片描述
.除数p(x)为0b10000 0111。

CRC算法参数模型

NAME:参数模型名称,决定了CRC位宽和POLY生成多项式。
WIDTH:宽度,即CRC位数。
POLY:生成项的简写,以16进制表示。例如:CRC-32即是0x04C11DB7,忽略了最高位的"1",即完整的生成项是0x104C11DB7。
INIT:这是计算CRC循环冗余码时,在数据后面预填充的预置值,十六进制表示。
REFIN:控制输入数据是否进行反转操作,True或False。若False,则输入数据的比特顺序反转,通常是将最高有效位(MSB)变为最低有效位(LSB)。
REFOUT:控制输出CRC校验值是否进行反转操作。在计算左移后数据多项式模二除以生成多项式后,余数(即CRC校验值)是否按位反转,True或False。
XOROUT:计算结果与此参数异或后得到最终的CRC值。

数据m(x)=0x31 ,CRC-8算法为例,该算法生成多项式G(X)为在这里插入图片描述
.除数p(x)为0b10000 0111。数据m(x)左移八位即x8m(x)=0x3100。 p(x) 模二除以x8m(x)的余数为0x97.

以CRC-16/DNP算法为例,
● 多项式公式G(X)为x16 + x13 + x12 + x11 + x10 + x8 + x6 + x5 + x2 + 1,除数为p(x)=0x13D65= 0b10011 1101 0110 0101。
● 数据m(x)为=0x31=0b0011 0001。由于CRC-16/DNP模型的输入数据反转,其值RefIn m(x) =0b1000 1100 =0x8C。数据m(x)左移16位即x16RefInm(x)=0x8C0000。
● x16RefIn m(x) = 0x8C0000模二除以p(x) = 0x13D65 的余数为r(x)=0b0101 1001 1011 0101=0x59b5.输出数据翻转RefOut r(x)=0b1010 1101 1001 1010 =0xAD9A。
● 结果异或值XorOut为0xFFFF,CRC-16/DNP算法的CRC值= 结果异或值XorOut 按位异或 输出数据翻转RefOut r(x),即RefOut r(x) ^ XorOut 。其值为0xAD9A ^ 0xFFFF = 0xE265。

传统移位法CRC算法

实际应用时,发送方和接收方按以下方式通信:
发送方和接收方在通信前,约定好一个预设除数P(X)。P(X)首位和最后一位的系数必须为1. 以上面的CRC-8为例,多项式(poly)为X8 + X2 + X +1,对应除数P(X) = 10011.
发送方在发送前,将原始数据左移 除数P(X)的次幂的位,将其值进行模二除法运算生成余数F(X)(即CRC码),然后将其附加到原始数据后面一起T(X)发送给接收方。
接收方收到后将其T(X)模二除以约定好的除数P(X),当且仅当余数为0时接收方认为没有差错.

CRC校验码的编码方法是用待发送的二进制数据D(x)昧以生成多项式G(x),将最后的余数作为CRC校
验码。其实现步骤如下:
①没待发送的数据块是P位的二进制多项式D(x).生成多项式为i阶的G(x)。在数据块的末尾掭加i
个0.数据块的长度增加到m+i位.对应的二进制多项式为xiD(x).
②用生成多项式G(x)去除xiD(x),求得余数为阶数为i-1的二进制多项式R(x)。此二进制多项式R(x)
就是D(x)经过生成多项式G(x)编码的CRC校验码。
③用xiD(x)以模2的方式减去R(x),得到二进制多项式xiD’(x)。xiD’(x)就是包含了CRC校验码的
待发送字符串。

基于查表法的CRC算法

计算机操作单元一般为字节为单位,所以采用一个或者多个字节长度的CRC进行校验传递数据,提高CRC校验速度。 预先将CRC计算出来,并存到校验表里,且校验表存在下述关系
该行的首个CRC码与该列的首个CRC码的异或值 与他们交集的CRC码相同,每次调用CRC算法采用查表法替代移位计算发放,可提升计算速度。

以单字节长度为例,有256种情况,对应CRC校验码(余数)有0~255种,将256种CRC校验码分别计算出来,按照顺序存放在一个包含256个入口地址的校验表中,然后对输入数据流采用查表可直接查询表中对应的CRC余数。

CRC查表法的实现过程,以单字节为例,建立单字节CRC-16编码余数r(x)字节表。对于任意一个字节,高4bit对应余数r(x)表的行数,低4bit余数r(x)表的列数。
以单字节数据0x31,CRC算法模型采用CRC-16/DNP为例,展示查表法单字节的实现过程。数据0x31的高4bit为0x3,对应H4B的序号为3的行,低4bit为0x1,对应L4B的序号为1的列,即单字节数据0x31的 CRC-16/DNP对应余数是0xad9a,余数再经过XOROUT结果异或值0xFFFF后,即0xad9a ^ 0xFFFF = 0x5265(数据0x31的CRC码)

CRC-16/DNP 余数表
H4B\L4B0123456789ABCDEF
00000365e6cbc5ae2d978ef26b5c4839aff89c9d79335a56b26f110af4a4d7c13
1b26b8435ded7e8896b135d4d07af31f14de27bbc215e1700949aa2c4f826ce78
229af1ff14513734df0d7c6899c6baa35d626e078ba9a8cc40f5e390063e255bc
39bc4ad9af778c12642bc74e22e00185e644d521308f13eafbd358b6bd189e7d7
4535e65003fe209bc8a26bc78e69ad0c4acd79a89c06bf63575af43f119132f4d
50xe1350xd76b0x8d890xbbd70x384d0x0e130x54f10x62af0x1ebc0x28e20x72000x445e0xc7c40xf19a0xab780x9d26
60x7af10x4caf0x164d0x20130xa3890x95d70xcf350xf96b0x85780xb3260xe9c40xdf9a0x5c000x6a5e0x30bc0x06e2
70xc89a0xfec40xa4260x92780x11e20x27bc0x7d5e0x4b000x37130x014d0x5baf0x6df10xee6b0xd8350x82d70xb489
80xa6bc0x90e20xca000xfc5e0x7fc40x499a0x13780x25260x59350x6f6b0x35890x03d70x804d0xb6130xecf10xdaaf
90x14d70x22890x786b0x4e350xcdaf0xfbf10xa1130x974d0xeb5e0xdd000x87e20xb1bc0x32260x04780x5e9a0x68c4
A0x8f130xb94d0xe3af0xd5f10x566b0x60350x3ad70x0c890x709a0x46c40x1c260x2a780xa9e20x9fbc0xc55e0xf300
B0x3d780x0b260x51c40x679a0xe4000xd25e0x88bc0xbee20xc2f10xf4af0xae4d0x98130x1b890x2dd70x77350x416b
C0xf5e20xc3bc0x995e0xaf000x2c9a0x1ac40x40260x76780x0a6b0x3c350x66d70x50890xd3130xe54d0xbfaf0x89f1
D0x47890x71d70x2b350x1d6b0x9ef10xa8af0xf24d0xc4130xb8000x8e5e0xd4bc0xe2e20x61780x57260x0dc40x3b9a
E0xdc4d0xea130xb0f10x86af0x05350x336b0x69890x5fd70x23c40x159a0x4f780x79260xfabc0xcce20x96000xa05e
F0x6e260x58780x029a0x34c40xb75e0x81000xdbe20xedbc0x91af0xa7f10xfd130xcb4d0x48d70x7e890x246b0x1235

参考链接

【科普向】谁都能看懂的CRC(循环冗余校验)原理:https://blog.csdn.net/weixin_44256803/article/details/105805628
什么是CRC:https://info.support.huawei.com/info-finder/encyclopedia/zh/CRC.html
CRC校验查表法原理及实现(CRC-16): https://blog.csdn.net/AgonyRR/article/details/107810982
CRC循环冗余校验 查表算法的代码实现:https://blog.csdn.net/weixin_44256803/article/details/111794445
CRC在线计算: http://www.ip33.com/crc.html
[1]马群,王会燃.基于查表法的嵌入式系统CRC算法研究[J].软件导刊,2014,13(10):51-52.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值