
这小节中我们要学习循环冗余校验码,英文缩写叫CRC码。这个小节中,我们首先会介绍CRC 码的基本思想,然后介绍如何构造,如何使用也就是如何检错和纠错。

首先来看一下这种校验码的基本思想。我们从大家熟悉的十进制出发,假设现在你要给另一个人传送882这样的一个十进制数据。为了防止传送数据的过程中,某一个数据位发生错误,你可以和你的另一个小伙伴约定一个除数,比如说是7,882÷7 刚好是除的尽的,最后我们算得的余数应该是等于0。当数据的接收方接收到数据的时候就可以用它接收到的这个数据和你们约定的除数进行一个除法操作,检查一下余数是否为零?如果余数不等于零,是不是就可以确定数据传输的过程中肯定是发生了错误,比如说对方收到的其实是883,也就是最后一个数发生了错误,那883÷7,最后可以算得余数等于1不等于0,这就说明肯定是发生了错误,需要重新传送,再比如说第二个数据位发生了错误,由8变成了5,那么除以七得到的余数是等于5,同样这种情况也可以确定我们的数据传输肯定出现了问题,这是大家熟悉的十进制除法。我们通过约定一个除数,然后在接收到数据之后,与这个除数进行相除的操作检查余数是否发生了改变。用这样的方式就可以检测出数据传送的错误。
这个小节中,我们要学习的循环冗余校验码和我们刚才说到的十进制除法的例子,其实是类似的思想。数据的发送方和接收方会先约定一个除数,当然了,我们处理的是计算机里边的数据,所以这个除数肯定是一个二进制的除数,然后我们会想办法在K个原始的信息位后面加上R个校验位,我们需要确保拼接上R个校验位之后,一整串的数据和我们刚才约定的除数进行相除的操作,余数要等于0。接下来,数据的接收方接收到这K+R位的数据之后,需要用二进制除法来检查余数是否等于零。如果余数不等于0,就说明有一些二进制位出现了错误,这种情况下我们就可以进行重传,或者某些时候也可以进行单比特位的纠错,这个我们一会儿再展开。
总之这就是循环冗余校验码的一个思想和大家熟悉的十进制除法,其实是有某些联系的。刚才我们说过,构建循环冗余校验码,需要有两个关键的要素,一个是除数,一个是被除数。

一般来说题目里会用生成多项式的方式给出除数。注意观察这个生成多项式,我们可以把它写成1乘以x的三次方,加上1乘以x的二次方,加上0乘以x 的一次方,再加上1乘以x的零次方,由于这个生成多项式里边所有的这些项,它的系数要么为一,要么为零。因此我们可以把这个生成多项式,转换成对应的二进制数,像这个G(x),我们可以转换成1

最低0.47元/天 解锁文章
6763

被折叠的 条评论
为什么被折叠?



