爲CRC32的多項式是:
0X 04 C1 1D B7
X + X + X + X + X + X + X + X + X + X + X + X + X + 1
其中工程以在二進制:
隨意數1和0,但你會發現它們匹配了多項式,其中1
是0位(或第一位)和x
是位1(或第二位)。
爲什麼這個多項式?因爲需要一個給定多項式的標準,並且標準由IEEE 802.3設置。此外,找到能夠有效檢測不同位錯誤的多項式非常困難。
你可以把CRC-32的一系列的「二進制運算與無懷揣」,或基本上是「XOR和移位操作」。這在技術上被稱爲多項式算術。
爲了更好地理解它,認爲這乘法:
(x^3 + x^2 + x^0)(x^3 + x^1 + x^0)
= (x^6 + x^4 + x^3
+ x^5 + x^3 + x^2
+ x^3 + x^1 + x^0)
= x^6 + x^5 + x^4 + 3*x^3 + x^2 + x^1 + x^0
如果我們假設x是基礎2,那麼我們得到:
x^7 + x^3 + x^2 + x^1 + x^0
爲什麼?由於3X^3^11倍11(但我們只需要1或0前位),所以我們延續:
=1x^110 + 1x^101 + 1x^100 + 11x^11 + 1x^10 + 1x^1 + x^0
=1x^110 + 1x^101 + 1x^100 + 1x^100 + 1x^11 + 1x^10 + 1x^1 + x^0
=1x^110 + 1x^101 + 1x^101 + 1x^11 + 1x^10 + 1x^1 + x^0
=1x^110 + 1x^110 + 1x^11 + 1x^10 + 1x^1 + x^0
=1x^111 + 1x^11 + 1x^10 + 1x^1 + x^0
但數學家改變了規則,所以它是國防部2所以基本上任何二進制多項式模2只是加法,不帶進位或XOR。所以,我們原來的公式是這樣的:
=(1x^110 + 1x^101 + 1x^100 + 11x^11 + 1x^10 + 1x^1 + x^0) MOD 2
=(1x^110 + 1x^101 + 1x^100 + 1x^11 + 1x^10 + 1x^1 + x^0)
= x^6 + x^5 + x^4 + 3*x^3 + x^2 + x^1 + x^0 (or that original number we had)
我知道這是信仰的飛躍,但是這超出了我的能力,作爲一個行程序員。如果你是一名核心的CS學生或工程師,我挑戰打破這一點。每個人都會從這個分析中受益。
所以制定出一個完整的例子:
Original message : 1101011011
Polynomial of (W)idth 4 : 10011
Message after appending W zeros : 11010110110000
現在,我們通過使用CRC算術保利劃分擴充消息。這是因爲以前一樣分工:
1100001010 = Quotient (nobody cares about the quotient)
_______________
10011) 11010110110000 = Augmented message (1101011011 + 0000)
=Poly 10011,,.,,....
-----,,.,,....
10011,.,,....
10011,.,,....
-----,.,,....
00001.,,....
00000.,,....
-----.,,....
00010,,....
00000,,....
-----,,....
00101,....
00000,....
-----,....
01011....
00000....
-----....
10110...
10011...
-----...
01010..
00000..
-----..
10100.
10011.
-----.
01110
00000
-----
1110 = Remainder = THE CHECKSUM!!!!
分裂產生的商,這是我們扔掉,和餘數,它是計算校驗和。這結束了計算。通常,校驗和會附加到消息中並傳輸結果。在這種情況下,傳輸將是:11010110111110.
僅使用一個32位的號碼作爲除數,並使用你的整個流作爲分紅。拋出商並保留餘數。將剩下的部分放在郵件末尾,並且您有一個CRC32。
普通人回顧:
QUOTIENT
----------
DIVISOR) DIVIDEND
= REMAINDER
- 取前32位。
- 移位位
- 如果32位爲小於DIVISOR,去通過DIVISOR步驟2
- XOR 32位。轉到步驟2.
(請注意,該流必須可以被32位分割,或者它應該被填充。例如,一個8位ANSI流將不得不被填充。流,該師被暫停。)
您的用於生成CRC32表的代碼看起來是正確的。您的lsbit優先(* reverse *)CRC32多項式'0xEDB88320'也可以寫爲msbit-first(* normal *)作爲「0x04C11DB7」。您使用相同的CRC多項式生成的表值是否在其他地方生成? – jschmier 2011-01-27 20:23:06