CRC冗余的数学原理和纠错功能


在介绍重点内容之前先介绍一下模二加法,模二减法,模二乘法与除法

1、模二加法

模二加法,看起来是不是和十进制加法有些类似,比如都有进位,模都有上限。但是在CRC这里的模二加法不考虑进位,它说是模二加法,不如说它是异或运算,为什么这么说呢?看个例子:

比如1001+0101,如果是常规的二进制计算其结果位1110,但是换成模二运算的话,其结果就变为了1100,因为在计算中将进位忽略了,这就导致这种运算实际上是位与位的异或运算,我们其实也可以以更简单的方式去看待这个模二加法,就是只需要关注两个数对应的位所拥有的1的个数是偶数还是奇数,如果是偶数那么就是0,奇数就1。比如上例中1001与0101的第一位所组成的1的个数是1,是奇数那么最终结果的第一位就是1,后面的以此类推。

2、模二减法

模二减法其实与模二加法差不多,模二加法不考虑进位,而模二减法认为当某个位不够减的时候,默认是有前面的位借给它一位的,不管它前面是否真的有足够的位去借给它。这么说其实也是很乱。其实还是认为两个数的每一位做异或运算即可,如1001-0011,如果是普通的二进制减法其结果位0110,但是如果是模二减法的话,其结果为1010,计算原理还是看两个数对应位所拥有的1的个数,奇数为1,偶数为0,与模二加法一致。

3、模二乘法

我们在计算十进制的乘法时一般都是以下图的方式计算:

当我们计算到下面红框的时候,其实也是进行十进制进位的加法的运算,模二乘法其实也是一样,只不过在计算到红框中的内容的时候,进行的是模二加法,即不进位的二进制运算。

下面是模二乘法的例子:

4、模二除法

模二除法不太好讲,看下面的例子:

我们看到上面是两个二进制的模二除法,其实和十进制的除法也是十分类似的。与模二乘法类似,里面使用的是模二减法,但是其实本质还是异或运算。每一层的除数就是根据模二减法计算出来的,然后如图所示,当除法的移位移动至除数的最后一位的时候,这时其结果就是余数。

5、CRC的数学原理

我们设一个将要传送的编码为M(一个二进制数),那么这个M一定可以被分解为X*Y+R,其中X和Y为组成 M的两个数,R为M的余数,余数可为0,比如55,那么X,Y和R的取值就有许多种,比如6*9+1,或者5*10+5,于是我们可以得到一个式子M=X*Y+R,我们将式子两边同时除以X或者Y都行,得到下面的式子M/Y=X+R/Y,我们将R/Y移动到式子的左边得(M-R)/Y=X,然后我们再将式子两边都乘上Y得,M-R=X*Y。如果我们设我们要传送的二进制数是M-R,那么当对端接收到M-R之后,只要将这个数除以之前约定的X或者Y,那么必定可以整除,即余数为0,那么就说明我们的编码是没有传送错误的。到这里先有个印象。看下面。

我们都知道如果我们要计算一个FCS,那么就必须要有原二进制编码,一个生成式,然后在二进制编码的尾部加上(生成式位数-1)的0,我们称其结果为码A,然后我们要将码A/生成式代表的二进制数,取其余数(一般余数的位数与生成树位数-1的个数相同),然后将码A与余数相加。至此FCS就计算出来了。

但是这个过程又和上面有上面关系呢。我们发现在计算FCS的时候,是原二进制数+余数,而不是上面的M-R。没有关系,我现在问一个问题,M+R的值现在为多少呢?我们已知M-R=X*Y,那么M+R=X*Y+R+R,我们知道在CRC的运算过程中是使用模二加法,那么R+R的结果必为0,比如110+110,我们对每一位做异或运算,可知其结果均为0,于是M+R=X*Y+R+R又转变为了M+R=X*Y,所以M+R作为编码传送过去之后,只要对端使用约定的二进制作为除数,在没有传送错误的基础上就可以将其整除,即余数为0,反之,则传送中出现了错误。

(注意上面使用的全部都是模二的算术运算,加减乘除都是)

 其实这个数学原理是让人更加透彻的理解这个过程,死记公式感觉也不是不行。

6、CRC是如何纠错的

这是有效信息为4位1101,生成式为1101,FCS码出错时对应的余数的表现形式。因为FCS码的长度为7位,且生成式的长度位4,所以叫(7,4)码。

人们通过研究发现如果不断地将出错地FCS码地余数的最低位补0,并除以生成式对应的二进制数的话,其算术运算的余数会出现上图中余数列的不断循环。比如001将其最低位补0并除以1101,其余数位010,010低位补0并处于1101,其余数为100..........由此不断地重复此操作,其余数就会以上图余数那一列地顺序不断地循环下去。于是人们就想到一个比较有意思的方法取纠错。

比如我们取第一个错的FCS码作为例子,它的编码的1101000,余数为001,因为它的余数不为0所以我们知道它出现了错误,此时我们将其余数低位补0并除以1101,于此同时我们将1101000向左移动一位,但是注意这里不是将高位的1溢出抹去,而是将高位的1放在最低位上,就好比贪吃蛇游戏,当我们小蛇爬出屏幕上边界的时候,又会从屏幕下边界冒出来,这边也是如此。当我们不断地将余数低位补0除以1101,并将错误编码向左移动地时候,直到余数变为101的时候,这是的编码的最高位就是错误的那一位。因为这个例子中我们错误的刚好时最低位,余数必须经过六次的操作才会变为101,也就是循环中的最后一个,同样的我们错误的那一位也必须向左移动6次才会变为最高位,这时我们将最高位取反就将该位恢复正常了。取反之后我们还需向左移动(7-1)位就将错误的编码转变位正确的编码了。其中7位是总的FCS码的位数,1是7减去余数转变的次数。

下面是常用的生成式的例子:

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mllllk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值