CRC32算法学习笔记——四表法

简单的前面是优雅,背后是复杂

关于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次迭代异或的结果,那么

B1CRC=T1[B1] XOR B2,B3,B4

经过第一步和第二步16次迭代异或,其结果再和B3,B4异或,可以求出B1,B2总共16位数据的CRC校验码。

B1B2CRC=(第一步迭代结果) 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值