简单的前面是优雅,背后是复杂
关于CRC32的详细推导以及查表法的由来可以看这篇博文,写的挺详细的
http://blog.csdn.net/sparkliang/article/details/5671510
CRC32四表法
看一下计算过程
上表中,如果最高位是1,G就是生成多项式;如果最高位是0,G就是0。
异或运算满足结合率。
利用异或运算的结合率,先执行B1,00,00,00与G之间的8次异或运算,即第一步8次迭代异或,将结果和B2,B3,B4异或就可以求出B1的CRC校验码。因为B1共有8位,所以B1所有可能的值共有256个,那么第一步8次迭代的结果就有256个,这256个结果组成第一张表T1,即T1表中存的是B1,00,00,00与G 8次迭代异或的结果,那么
B1的CRC码=T1[B1] XOR B2,B3,B4
经过第一步和第二步16次迭代异或,其结果再和B3,B4异或,可以求出B1,B2总共16位数据的CRC校验码。
B1B2的CRC码=(第一步迭代结果) XOR (第二步迭代结果) XOR B3,B4
第一步迭代结果可以通过B1查表得到
第一步迭代结果 = T1[B1]
设T1[B1]的4个字节分别是B11,B12,B13,B14。
我们观察上面的计算过程,可以发现第一步迭代和第二步迭代的过程完全是一样的,只不过是寄存器中的高8位由B1换成了B11,既然第一步迭代的结果可以通过B1去查询T1得到,类推一下,第二步迭代也可以通过B11去查询T1得到,即
第二步迭代结果 = T1[B11] XOR B12,B13,B14
= T1[T1[B1]>>>24)]XOR (T1[B1]<<8)
第二步迭代异或的结果组成第二张表T2,即
T2[i]= T1[ T1[i]>>>24 ] XOR ( T1[i]<<8 )
以此类推,可以得到第三、第四张表T3和T4。
T3[i]= T1[ T2[i]>>>24 ] XOR ( T2[i]<<8 )
T4[i]= T1[ T3[i]>>>24 ] XOR ( T3[i]<<8 )
第一步迭代反应的是B1对Gx的影响,第二步迭代反应的是B2对Gx的影响,以此类推。
将4张表中的结果异或,就可以得到32次迭代的结果,相当于一次处理了32位数据。
crc = T1[(crc>>>24)^B1]^ T2[(crc>>>16)^B2]^T3[(crc>>>8)^B3]^T4[crc^B4]
最后,上面是认为源数据高位在左,在程序中可能认为高位在右,所以要进行位逆转。
转载请指明原文出处http://blog.csdn.net/fxdaniel/article/details/41693423