我試圖計算逐個字節的以太網數據包的幀校驗序列(FCS)。多項式爲0x104C11DB7
。 我也跟着在這裏看到http://en.wikipedia.org/wiki/Cyclic_redundancy_check或這裏http://www.woodmann.com/fravia/crctut1.htm以太網CRC32計算 - 軟件vs算法結果
的XOR-SHIFT算法假設應該有一個CRC只有一個字節的信息。假設它是0x03。
步驟:墊32位到右側
0x0300000000
對齊多項式,並在與它們的第一比特的左手側是不爲零的數據和XOR它們
0x300000000 xor 0x209823B6E = 0x109823b6e
帶餘數對齊再次異或
0x109823b6e xor 0x104C11DB7 = 0x0d4326d9
由於沒有更多的位左的×03的CRC32應該是0x0d4326d9
不幸的是所有的軟件實現告訴我,我錯了,但我做了什麼錯了還是什麼他們有不同的表現嗎?
Python的告訴我:
"0x%08x" % binascii.crc32(chr(0x03))
0x4b0bbe37
的在線工具,這裏http://www.lammertbies.nl/comm/info/crc-calculation.html#intr得到相同的結果。 我的手計算和上述軟件使用的算法有什麼區別?
UPDATE:
原來有一個類似的問題已經在堆棧溢出:
您發現這裏Python CRC-32 woes
答案雖然這不是很直觀。如果你想它是如何對以太網進行更正式的描述幀,你可以看看Ethernet Standard document 802.3 3部分 - 第二章3.2.9幀校驗序列字段
讓我們繼續從上面的例子:
顛倒你消息的位順序。這代表他們會逐漸進入接收器的方式。因此
0x03
是0xC0
補充第一32位的消息的。注意我們再次用32位填充單個字節。
0xC000000000 xor 0xFFFFFFFF = 0x3FFFFFFF00
從上面再次完成XOR和移方法。經過約6步你:然後
0x13822f2d
以上位sequense的補充。
0x13822f2d xor 0xFFFFFFFF = 0xec7dd0d2
請記住,我們顛倒了位,以獲得在第一步中的以太網線表示。現在我們必須扭轉這一步,最終完成我們的任務。
0x4b0bbe37
誰用做它應該是這樣過來......
很多時候,你真正想知道您收到的消息是正確的。爲了達到此目的,您需要收到您收到的包含FCS的消息,並執行與上述相同的步驟1至5。結果應該是他們所說的殘渣。對於給定的多項式,這是一個常數。在這種情況下,它是0xC704DD7B
。
作爲mcdowella提到你必須玩弄你的一些東西,直到你找到正確的,取決於你使用的應用程序。
0x209823B6E從哪裏來? – grieve 2012-02-15 05:31:26
您是否還將初始餘數設置爲0xFFFFFFFF – grieve 2012-02-15 05:48:41
0x209823B6E是多項式的移位版本,以便將其與數據 – sebs 2012-02-15 20:56:14