CRC循环校验码原理及计算举例

循环冗余校验码(CRC),简称循环码,是一种常用的、具有检错、纠错能力的校验码,在早期的通信中运用广泛。通过某种数学运算来建立数据位和校验位的约定关系。这种数学运算就是“模2除法”。这种编码基本思想是将要传送的信息M(X)表示为一个多项式L,用L除以一个预先确定的多项式G(X),得到的余式就是所需的循环冗余校验码,所以这种校验又称多项式校验。理论上可以证明循环冗余校验码的检错能力有以下特点:①可检测出所有奇数位错;②可检测出所有双比特的错;③可检测出所有小于、等于校验位长度的突发错。

1.模2除法

先说下什么是“模2除法”,我们知道模2加减是不进位、不借位的加减法,比如1+1=0,1+0=1,101+011=110,等于每一位的异或运算,相同bit加减为0,不同bit加减则为1。模2除法同理,即当部分余数首位是1时商取1,反之商取0。然后每一位的减法运算是按位减,不产生借位。余数的位数一定要是比除数位数只能少一位,哪怕前面位是0,甚至是全为0(附带好整除时)也都不能省略。举例如下图所示:
在这里插入图片描述

2.校验位的生成

循环冗余校验码由信息码n位和校验码k位构成。k位校验位拼接在n位数据位后面,则n+k为CRC校验码的字长。n位信息位可以表示成为一个报文多项式M(x),最高幂次是x^(n-1)。 约定的生成多项式G(x)是一个k+1位的二进制数,最高幂次是x^k。 将报文多项式M(x)乘以x^k,即其对应的2进制序列左移k位后,模2除以G(x),得到的k位余数就是校验位。将这些校验位加在被除数上,作为实际发送的数据,则传输过程中如果不出错,收端收到的数据一定是可以整除校验位的,因为导致不能整除的余数已经在发送的时候被模2加在了被除数上。生成多项式必须是发送端和接收端都知道的信息,且最高位和最低位必须均为“1”。

3.计算举例

下面通过一个例子来进一步解释CRC的基本工作原理:
(1)假设约定的生成多项式为G(x)=x^4+x+1,则其二进制表示为10011,共5位,其中k=4。
(2)假设要发送数据序列的二进制为101011,共6位,则报文多项式为M(x)=x^5
+x^3+x+1。
(3)将报文多项式乘以x^k, 即乘以x^4, 生成M(x)*x^k = x^9 + x^7 +x^5 + x^4,表示为二进制则为1010110000,即等于在要发送的二进制数据后面加4个0,共10位。
(4)用生成多项式的二进制表示10011去除1010110000,按模2算法求得余数比特序列为0100(注意余数一定是k位的)。
在这里插入图片描述
(5)将余数添加到要发送的数据后面,得到真正要发送的数据的比特流:1010110100,其中前6位为原始数据,后4位为CRC校验码。
(6)接收端在接收到带CRC校验码的数据后,如果数据在传输过程中没有出错,将一定能够被相同的生成多项式G(x)除尽,如果数据在传输中出现错误,生成多项式G(x)去除后得到的结果肯定不为0。

发布了24 篇原创文章 · 获赞 66 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/m0_45416816/article/details/103176827