這幾天在研究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值了。