!!模二除法
在进行CRC原理解析之前,我们需要先了解什么是模二除法,因为在CRC校验中使用的是模二除法,而非算术除法。
以120/9为例,比较一下两种除法的区别:
120的二进制:0b01111000
9的二进制: 1001
算术除法: 120/9 = 13余3
---------
1101 除数
1001)1111000
。。。。。。0011 余数
模二除法:120/9 = 14余6
模二除法,既不向上借位,也不比较除数和被除数的相同位数值的大小。
模二加法:1+1=0,1+0=1,0+0=0
模二减法:1-1=0,1-0=1,0-1=1,0-0=0
模二的加减法等同于做异或(XOR)
计算过程:
在学习CRC校验时,一定要明白模二除法,CRC校验是基于模二除法的。
CRC校验原理
CRC算法就是把传输数据当作一个位数很长的数,然后将这个数模二除另一个数(这个数对应的就是CRC的多项式(Poly)),其所得的余数即为CRC校验码。
举个例子来说,传输数据为:10110011
除的另一个数为(我们选择的多项式):11001 (长度为5)
我们需要在传输数据后面补(多项式长度-1)个0
即: 10110011
0000
然后用这个数据对11001模二除,取得余数0100,这个0100即是CRC校验码。
我们会发现,CRC校验码的长度为我们所选多项式的长度-1,同时也是我们所需要补0的长度。
那么如何选择多项式(被除数)来生成CRC码呢?
任意一个二进制数,都可以对应一个多项式。如:10011 对应x4+0
x3+0x2+x1+1,简化一下就是:x4+x1+1。(我们也会发现这就是CRC-4)
所以就产生的了标准的CRC生成多项式:
另外我们或许会有疑问,为何标准的多项式这样选择,而不是选择其他的多项式?
这是因为不同的多项式校验的效果不一,特别的多项式能够明显减小错误率。
另外,一篇英文论文对CRC进行了很好的解释,大家可以阅读参考一下。
A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS