在网上找了很多资料, 也看了别人写的CRC的实现代码,但发现都不是很懂,大多都没有注释,于是自己就找一个最简单原理去实现,先后把实现后计算出来的结果和网上一个关于CRC计算的结果相比较,来验证自己是否写的是对的.
这里是一个关于CRC计算的网站.
现在来开始讲解原理部分,我只列出最简单的一部分.
CRC算法将长度为m位的消息对应一个GF(2)多项式M,比如对于4位消息1111,则它对应的多项式为x^3 + x^2 + x^1 + x。发送端和接收端约定一个次数为r的 GF(2)多项式G,称为生成多项式,比如x^3 + 1,r = 3, 它对应的二进制码是1001。在消息后面加上r个0对应的多项式为M’,显然有M’ = Mx^r。用M’除以G将得到一个次数等于或小于r - 1的余数多项式R,其对应的r位数值则为校验码。如下所示:
1110 商为1110,商有4位,表示进行了4次XOR
________
1001/1111000 被除数是1111000,除数是1001
1001 ^
----
1100 第一次XOR后得到011,加入下一位0。最高位的0可以消掉了,这样最高位是1,所以下个商是1
1001 ^
----
1010 第二次XOR后得到0101,加入下一位0。最高位的0可以消掉了,这样最高位是1,所以下个商是1
1001 ^
----
0110 第三次XOR后得到0011,加入下一位0。最高位的0可以消掉了,这样最高位是0,所以下个商是0
0000 ^