对循环冗余校验码(CRC)的一些体会

来源:互联网 发布:日本护肤品推荐 知乎 编辑:程序博客网 时间:2024/06/15 02:30

数据传输过程中数据可能会出现突变,所以需要校验,CRC是其中的一种校验码。它的总体思路是:

x=数A     (要进行校验的数)

y=数B    (传输双方约定好的一个数)

z=x/y的商

c=x/y的余数

x-c总能够整除y,我们在传输的时候传的是x-c,而c就是crc的检验码,

因此对方进行校验时,接收到的x-c应该总是能整除y的,如果不能整除就证明数据有误。

上面的说明用十进制数的运算来看很容易就能明白,但实际上我们的数据是以二进制数的形式来传输的,如果看过CRC码的产生过程,你可能就会有些疑惑了,那个过程中,并没有任何减法运算啊!不是的,已经减了,不过是模2减法,它首先将要传输的数据左移了k位(k等于校验码的位数),设移动后的数为A,然后进行模2除得出余数,亦即是校验码,到了最后,你可能以为是把校验码加到A上,其实不是,其实是A和校验码进行了模2减!数学真的是一样很奇妙的东西,并且凌驾于一切之上。模2加和模2减是等效的!

就这样,当对方收到数据时再进行一次除数相同的模2除,就知道有没有出错了。顺带一提,我看了几篇网上的文章介绍模2除的时候都说当余数首位是0时则商0,其实正确的说法应该是除去最高位后的余数部分的首位,而不是余数首位,就好像104/100的余数是多少?是4?不对,是004。。。。

 

原创粉丝点击