Algorithm-Design
如何以數學方式計算 CRC32?
我想直接使用多項式計算 CRC32 算法,但我不知道如何。我發現這裡列出的生成多項式https://en.wikipedia.org/wiki/Cyclic_redundancy_check。這對應
0xedb88320
於範常式式碼。有人可以定義一個計算與該算法相同結果的數學規範嗎?
最常見的 CRC32 是從 1988 年版 CCITT V.42 第 8.1.1.6.2 節中的 32-bit Frame Check Sequence 借來的,可在此處獲得,它給出了一個數學定義(注意:去掉明顯虛假的 $ 1 $ 後 $ x^{30} $ 在英文版中)。
我更喜歡這個替代定義,將多項式的一些數學運算替換為對位的等效運算:
- 將消息視為一個序列 $ n $ 按時間順序排列的位(如果消息以字或字節為結構:除非另有說明,否則低位在前)。
- 附加 $ 32 $ 一個位,形成一個序列 $ n+32 $ 位。
- 補充第一個 $ 32 $ 該序列的位。
- 形成度的二進制多項式(最多) $ n+31 $ , 有術語 $ x^{n+32-j} $ 出席(或缺席)時 $ j $ 上一步結果中的第 th位為1(分別為零),對於 $ j $ 和 $ 0<j\le n+32 $ .
- 計算該多項式除以二進制多項式的多項式餘數 $ x^{32}+x^{26}+x^{23}+x^{22}+x^{16}+x^{12}+x^{11}+x^{10}+x^8+x^7+x^5+x^4+x^2+x+1 $ ,形成度的二進制多項式(最多) $ 31 $ .
- 形成 $ 32 $ 位序列與 $ j $ 當術語時,第一個位(分別為零) $ x^{32-j} $ 在該多項式中存在(分別不存在),對於 $ j $ 和 $ 0<j\le 32 $ .
- 附加那個 $ 32 $ -原始消息的位序列(如果要轉換為字節:除非另有說明,否則該序列的第一位應為第一個字節的低位)。
注意:插入 $ 32 $ 步驟 2 中的位允許接收方處理消息的位,並且 $ 32 $ 位序列在接收時保持一致,直到該序列結束後才知道消息與最終 32 位序列之間的邊界。步驟 3 可能檢測到消息中的比特抑制,包括消息開頭的零比特。
注意:對於二元多項式(根據步驟 4 和 6 中的約定),步驟 2 和 3 的組合會發生變化 $ M(x) $ 到 $ M(x)\cdot x^{32}+\displaystyle\sum_{i=n}^{n+31}{x^i}+\sum_{i=0}^{31}{x^i} $ .
注意:步驟 4、5 和 6 可以替換為:
重複直到序列正好有 32 位:
如果第一位是一個:
- 補碼第 7位、第 10位、第 11位、第 17位、第 21位、第 22位、第 23位、第 25位、第 26位、第 28位、第 29位、第 31位、第 32位和第33位。
刪除第一位。