大家好,欢迎来到IT知识分享网。
CRC
循环冗余码(Cyclic Redundancy Code, CRC)是一种用于校验通信链路上数字传输准确性的计算方法(通过某种数学运算来建立数据位和校验位(CRC)的约定关系的)。它是利用除法以及余数的原理来作错误侦测。
发送方: 使用某公式计算出被传送数据所含信息的一个值,并将此值 附在被传送数据后。
接收方: 对同一数据进行相同的计算,应该得到相同的结果。对比CRC结果。
数学背景
模二运算
模二运算,是一种二进制的四则运算,包括模二加(+)、模二减(-)、模二乘(x)、模二除(/) 四种二进制运算。与四则运算不同的是模二运算不考虑进位和借位.
重点
- 模二加法和模二减法的结果是相同的,并且与异或(XOR)运算的结果是一致的。 异或运算可以代替模二加减运算。可用硬件XOR异或门硬件代替运算。
- 模二乘法可看作两个步骤, 可用AND与门代替运算。
a. 第一步被乘数的位跟乘数进行与运算,再根据被乘数的阶进行左移被乘数的阶数位,被乘数的位数对应n个部分积。
b. 部分积进行模二加法运算。 - 模二乘除法与普通乘除法一样演算,区别是模二除法的被除数部分的阶数与除数P的阶数相同时,进行部分XOR异或运算,得到商数和余数,将余数的阶数与除数P循环计算,直到余数的阶数小于R,这个余数就是附加的校验码。
关注模二除法,因为它与CRC算法密切相关,它有三个性质: - 当最后余数的位数小于除数位数时,除法停止。
- 当被除数的位数小于除数位数时,则商数为0,被除数就是余数。
- 只要被除数或部分余数的位数与除数一样多,且最高位为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算法
以单字节长度为例,有256种情况,对应CRC校验码(余数)有0~255种,将256种CRC校验码分别计算出来,按照顺序存放在一个包含256个入口地址的校验表中,然后对输入数据流采用查表可直接查询表中对应的CRC余数。
CRC-16/DNP 余数表
H4B\L4B | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0000 | 365e | 6cbc | 5ae2 | d978 | ef26 | b5c4 | 839a | ff89 | c9d7 | 9335 | a56b | 26f1 | 10af | 4a4d | 7c13 |
1 | b26b | 8435 | ded7 | e889 | 6b13 | 5d4d | 07af | 31f1 | 4de2 | 7bbc | 215e | 1700 | 949a | a2c4 | f826 | ce78 |
2 | 29af | 1ff1 | 4513 | 734d | f0d7 | c689 | 9c6b | aa35 | d626 | e078 | ba9a | 8cc4 | 0f5e | 3900 | 63e2 | 55bc |
3 | 9bc4 | ad9a | f778 | c126 | 42bc | 74e2 | 2e00 | 185e | 644d | 5213 | 08f1 | 3eaf | bd35 | 8b6b | d189 | e7d7 |
4 | 535e | 6500 | 3fe2 | 09bc | 8a26 | bc78 | e69a | d0c4 | acd7 | 9a89 | c06b | f635 | 75af | 43f1 | 1913 | 2f4d |
5 | 0xe135 | 0xd76b | 0x8d89 | 0xbbd7 | 0x384d | 0x0e13 | 0x54f1 | 0x62af | 0x1ebc | 0x28e2 | 0x7200 | 0x445e | 0xc7c4 | 0xf19a | 0xab78 | 0x9d26 |
6 | 0x7af1 | 0x4caf | 0x164d | 0x2013 | 0xa389 | 0x95d7 | 0xcf35 | 0xf96b | 0x8578 | 0xb326 | 0xe9c4 | 0xdf9a | 0x5c00 | 0x6a5e | 0x30bc | 0x06e2 |
7 | 0xc89a | 0xfec4 | 0xa426 | 0x9278 | 0x11e2 | 0x27bc | 0x7d5e | 0x4b00 | 0x3713 | 0x014d | 0x5baf | 0x6df1 | 0xee6b | 0xd835 | 0x82d7 | 0xb489 |
8 | 0xa6bc | 0x90e2 | 0xca00 | 0xfc5e | 0x7fc4 | 0x499a | 0x1378 | 0x2526 | 0x5935 | 0x6f6b | 0x3589 | 0x03d7 | 0x804d | 0xb613 | 0xecf1 | 0xdaaf |
9 | 0x14d7 | 0x2289 | 0x786b | 0x4e35 | 0xcdaf | 0xfbf1 | 0xa113 | 0x974d | 0xeb5e | 0xdd00 | 0x87e2 | 0xb1bc | 0x3226 | 0x0478 | 0x5e9a | 0x68c4 |
A | 0x8f13 | 0xb94d | 0xe3af | 0xd5f1 | 0x566b | 0x6035 | 0x3ad7 | 0x0c89 | 0x709a | 0x46c4 | 0x1c26 | 0x2a78 | 0xa9e2 | 0x9fbc | 0xc55e | 0xf300 |
B | 0x3d78 | 0x0b26 | 0x51c4 | 0x679a | 0xe400 | 0xd25e | 0x88bc | 0xbee2 | 0xc2f1 | 0xf4af | 0xae4d | 0x9813 | 0x1b89 | 0x2dd7 | 0x7735 | 0x416b |
C | 0xf5e2 | 0xc3bc | 0x995e | 0xaf00 | 0x2c9a | 0x1ac4 | 0x4026 | 0x7678 | 0x0a6b | 0x3c35 | 0x66d7 | 0x5089 | 0xd313 | 0xe54d | 0xbfaf | 0x89f1 |
D | 0x4789 | 0x71d7 | 0x2b35 | 0x1d6b | 0x9ef1 | 0xa8af | 0xf24d | 0xc413 | 0xb800 | 0x8e5e | 0xd4bc | 0xe2e2 | 0x6178 | 0x5726 | 0x0dc4 | 0x3b9a |
E | 0xdc4d | 0xea13 | 0xb0f1 | 0x86af | 0x0535 | 0x336b | 0x6989 | 0x5fd7 | 0x23c4 | 0x159a | 0x4f78 | 0x7926 | 0xfabc | 0xcce2 | 0x9600 | 0xa05e |
F | 0x6e26 | 0x5878 | 0x029a | 0x34c4 | 0xb75e | 0x8100 | 0xdbe2 | 0xedbc | 0x91af | 0xa7f1 | 0xfd13 | 0xcb4d | 0x48d7 | 0x7e89 | 0x246b | 0x1235 |
参考链接
【科普向】谁都能看懂的CRC(循环冗余校验)原理:https://blog.csdn.net/weixin_/article/details/
什么是CRC:https://info.support.huawei.com/info-finder/encyclopedia/zh/CRC.html
CRC校验查表法原理及实现(CRC-16): https://blog.csdn.net/AgonyRR/article/details/
CRC循环冗余校验 查表算法的代码实现:https://blog.csdn.net/weixin_/article/details/
CRC在线计算: http://www.ip33.com/crc.html
[1]马群,王会燃.基于查表法的嵌入式系统CRC算法研究[J].软件导刊,2014,13(10):51-52.
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/143620.html