这几天在研究CRC32的计算过程,看了CRC算法的原理,也看了不少通过移位法实现的代码,但是算出的结果跟校验工具算的不一致。
折腾了好长时间,终于找到一个手工计算CRC32的文章,再对照IEEE 802.3标准的CRC计算过程,才算把CRC32的计算搞定。
这里把计算过程的要点记录一下:
1) CRC32是CRC算法一种,先参考Wiki上CRC算法的原理和实例搞明白基本的计算方法。
2) 最常见的CRC32算法就是IEEE 802.3里生成FCS字段用的那个:
a) CRC32使用的Polynomial是
b) IEEE 802.3在传送数据时使用的是最低有效位优先 (least significant bit first),所以要根据你机器的架构转换成有效的比特流输入。同理,输出流也一样。
c) 为了有效识别输入流开头和结尾的零,开头的32位要按位取反(complement),最后计算出的余数也要按位取反。
按照上述方法计算能得到想要的CRC32值了。