平凡也就两个字: 懒和惰;
成功也就两个字: 苦和勤;
优秀也就两个字: 你和我。
跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!
关注微信公众号【 IT特靠谱 】,每天都会分享技术心得~
CRC循环冗余校验
1 CRC校验简介
1.1 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,则表示数据传输过程出现了错误。
1.2 模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,也无进位,无借位。
模2除法示例:
2 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,则表示数据传输过程出现了错误。
以上详细讲解了CRC校验码的计算方式,并得到了携带CRC校验码的新数据帧。你get到了吗?
(1) 商务合作微信号:M9392W
(2) 购物商城: 扫码即可进入博主开发的小程序购物商城,享超大优惠购物,支持一下博主吧~
(3) 博主微信公众号:IT特靠谱,学习更多开发实战技巧!