CRC校验原理与计算

CRC,(Cyclic Redundancy Check),循环冗余校验。


1,CRC的原理

CRC校验的原理在很多地方写的都比较详细,也比较复杂,但其本质就是一种校验码的计算方法。收、发双方在通信之前要约定好一个多项式(介绍原理的地方也叫做生成多项式,其实就是一串二进制码,关于多项式跟二进制码的对应关系可以参考附录1),通过信息码跟生成多项式做“模2除法”就能计算出校验码,当然,校验码的位数也是由生成多项式决定的(校验码位数=生成多项式对应二进制串位数-1)。


常用的生成多项式有:IBM的SDLC(同步数据链路控制)规程中使用的CRC-16,生成多项式g(x)= x16 + x15 + x2 +1(对应二进制比特串为:11000000000000101);而在ISO HDLC(高级数据链路控制)规程、ITU的SDLC、X.25、V.34、V.41、V.42等中使用CCITT-16生成多项式g(x)= x16 + x15 + x5 +1(对应二进制比特串为:11000000000100001)。


“模2除法”跟“算术除法”不同,它既不向上位借位,也不比较除数和被除数的相同位数值的大小,只是以相同位数做逻辑异或运算。模2加法运算为:1+1=0,0+1=1,0+0=0,无进位,也无借位;模2减法运算为:1-1=0,0-1=1,1-0=1,0-0=0,也无进位,无借位。

CRC校验原理与计算_第1张图片CRC校验原理与计算_第2张图片

“模2除法”和“模2乘法”示例


2,CRC的计算步骤

假设信息码是10110011,生成多项式约定为G(X) = X4 + X3 + 1,则对应的二进制串为11001,所以需要计算的校验码位数为4位。


1)信息码左移4位,末尾补0,得到101100110000,这个数以“模2除法”的方式除以生成多项式11001,得到的余数为0100,此即为CRC校验码。

CRC校验原理与计算_第3张图片

CRC校验码计算示例


2)将计算得到的CRC校验码0100,替换在信息码末尾补的4个0,得到101100110100,即为要发送的最终数据。


3)在接收端,因为把模2除法的余数加在了信息码的末尾,因此,在没有通信错误的情况下,收到的数是可以以“模2除法”的方式整除约定好的生成多项式的。这也就是CRC校验的原理。





附录

1,多项式跟二进制数的对应关系:多项式的最高幂次对应二进制数的最高位,以后各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0


参考文献:

https://baike.baidu.com/item/CRC%E6%A0%A1%E9%AA%8C/3439037?fr=aladdin

http://winda.blog.51cto.com/55153/1063951

你可能感兴趣的:(CRC校验原理与计算)