看很多人还是没懂CRC,我单独用一篇博客介绍定义后再用两道例题解析一下过程
目录
题:假设选择的CRC生成多项式为G(x) = x^4 + x^3 + 1,求出二进制序列10110011的CRC校验码? 最终的发送数据帧是多少?
题2:当我们要发送一帧数据时,要发送的数据为101110。采用CRC 生成多项式是编辑。试求应添加在数据后面的余数
什么叫CRC?
CRC即循环冗余校验码,是数据通信领域中比较常见的一种查错校验码,它的特征便是信息字段和校验字段的长度可以任意选定。
CRC是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,用来保证数据传输的正确性和完整性。
为什么要使用CRC?
CRC校验是一种常用检错校验方式。接收方用与发送方相同的模2除法的除数,并通过CRC校验来辨别数据再传输过程中是否出现的错误。注意CRC校验只能检错,不能纠错!
CRC校验原理:其根本思想就是先在要发送的数据帧后面附加一个CRC校验码(CRC校验码是通过发送端和接收端共同选定的某个特定除数通过模2除法计算出来的),生成一个新帧后发送给接收端。新帧到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)特定的除数,看是否能整除(由于在发送端发送的新帧末尾携带了CRC校验码,因此新帧是能整除以特定除数的(也就是模2除法计算后余数为0)),如果余数为0,则表示传输数据正确;如果余数不为0,则表示数据传输过程出现错误!
具体来说,CRC校验原理就是以下几个步骤:
(1)先选定一个特定的模2除数(二进制形式的除数,通常以多项式表示,所以CRC又称为多项式编码方法)。
(2)假设所选定的模2除数的二进制位数为k位,假设原数据帧位数为m位。然后在原数据帧后面加上k-1位个“0”(CRC占位值),然后以这个加了k-1个“0“的新数据帧(m+k-1位)以"模2除法"方式除以模2除数,所得到的余数就是该帧的CRC校验码,注意:余数的位数一定要是比除数位数只能少一位,也就是说余数长度为k-1位,不足则前面补0)。
(3)再把CRC校验码替换原数据帧末尾的CRC占位值,形成一个新数据帧,然后将新数据帧发送到接收端;
(4)最后在接收端再把这个新帧以“模2除法”方式除以前面选定的模2除数,如果余数为0,则表明该帧在传输过程中没出错;如果余数不为0,则表示数据传输过程出现了错误。
CRC码
CRC码又称多项式码,任何一个二进制数都可以和一个对应的多项式建立一一对应的关系
举例
1011011对应的多项式为
解析:对应位上为1,则加上对应位的x多少次方
比如,以上,第六位为1(二进制数最右面是第0位),则加上 ;第五位为0,则不加;第四位为1,则加上
,以此类推
那我下面给你们一个思考题:
对应的代码是多少?
答案是:110011
模2运算
"模2除法"与"算术除法"类似,但它既不向上位借位,也不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可。相当于二进制中的逻辑异或运算(二进制位相同异或值为0,二进制位不同异或运算值为1)!
模2加法位运算为:1+1=0,0+1=1,1+0=1,0+0=0,无进位,也无借位;
模2减法位运算为:1-1=0,0-1=1,1-0=1,0-0=0,也无进位,无借位。
余数应该比除数少一位,如果不够则在前面加0,这里余数是2位所以不用补0
CRC校验码计算
从上面的分析可以知道要计算出CRC校验码需要如下两个关键步骤:
(1)选定模2除数;
(2)通过模2除法计算CRC校验码
下面用一个例子来演示CRC校验码的计算。
题:假设选择的CRC生成多项式为G(x) = x^4 + x^3 + 1,求出二进制序列10110011的CRC校验码? 最终的发送数据帧是多少?
解析:
(1)首先把生成多项式转换成二进制数(模2除数),由G(x) = x^4 + x^3 + 1可以知道(模2除数一共是5位,位数等于最高位的幂次加1,即4+1=5),然后根据多项式各项的含义(多项式只列出二进制值为1的位,也就是这个模2除数二进制的第4位、第3位和第0位的二进制均为1,其它位均为0),这样我们就到模2除数的二进制比特串为11001;
(2)模2除数位数为5位,根据前面的介绍可得知CRC校验码的位数为4位(校验码的位数比生成多项式的位数少1);
(3)原数据帧为10110011,在它末尾加4个0(CRC占位值),得到101100110000,然后把这个数通过"模2除法"方式除以模2除数,得到的余数(即CRC码)为0100;
4)把上步计算得到的CRC校验0100替换原始帧101100110000后面的四个“0”(CRC占位值),得到带CRC校验码的新数据帧101100110100。再把这个新数据帧发送到接收端;
(5)当新数据帧到达接收端后,接收端会把这个新数据帧再用相同的模2除数11001以"模2除法"方式计算余数,验证余数是否为0,如果余数为0,则表明该帧在传输过程中没出错;如果余数不为0,则表示数据传输过程出现了错误。
可以看出余数在模2除法下等于0
题2:当我们要发送一帧数据时,要发送的数据为101110。采用CRC 生成多项式是
。试求应添加在数据后面的余数
解析:
这里就简化步骤,可以知道多项式对应的除数是1001(4位),余数则占3位;然后我们在发送数据后面加3个0,进行模2除法运算:
余数为011,所以要发送的数据帧为101110011,
当接收到后,又对数据进行验证:
至此,经过几道实例的讲解,大家应该明白CRC的计算方法和步骤了