CRC 算法的基本思想是将传输的数据当做一个位数很长的数。将这个数除以另一个数。得到的余数作为校验数据附加到原数据后面。还以上面例子中的数据为例:
6、23、4 可以看做一个2进制数: 0000011000010111 00000010
假如被除数选9,二进制表示为:1001
则除法运算可以表示为:
可以看到,最后的余数为1。如果我们将这个余数作为校验和的话,传输的数据则是:6、23、4、1
CRC 算法和这个过程有点类似,不过采用的不是上面例子中的通常的这种除法。在CRC算法中,将二进制数据流作为多项式的系数,然后进行的是多项式的乘除法。还是举个例子吧。
比如说我们有两个二进制数,分别为:1101 和1011。
1101 与如下的多项式相联系:1x3+1x2+0x1+1x0=x3+x2+x0
1011与如下的多项式相联系:1x3+0x2+1x1+1x0=x3+x1+x0
两个多项式的乘法:(x3+x2+x0)(x3+x1+x0)=x6+x5+x4+x3+x3+x3+x2+x1+x0
得到结果后,合并同类项时采用模2运算。也就是说乘除法采用正常的多项式乘除法,而加减法都采用模2运算。所谓模2运算就是结果除以2后取余数。比如3 mod 2 = 1。因此,上面最终得到的多项式为:x6+x5+x4+x3+x2+x1+x0,对应的二进制数:111111
加减法采用模2运算后其实就成了一种运算了,就是我们通常所说的异或运算: