2014-04-17 43 views
0

我一直在這上面掛太多時間...
我讀過«CRC無錯指南誤差檢測算法»好幾次了。可能我並不完全理解理論,但實踐看起來像天空一樣清晰,但有些不妥。
我不是關於代碼和特定的實現,而是概念(一個普通的方法)。

crc32計算(我在絕望中)

我這樣做:
1.取一個字節。
2.取一個uint並用0xffffffff填充。
3.檢查最高位是否爲1.
4.向左移一位。
5.將源字節的下一位置起來。
6. Step3檢查是否爲真,然後用0x04C11DB7異或。
7.數據結束後,反轉(反映)工作uint。
8.爲0xffffffff

XOR它和它的作品...但只用零(我檢查了1,2,3,4個字節的0)。但是,當我採取一個字節0x01它失敗(在線計算器顯示不同的結果)。我無法理解我做錯了什麼。

循序漸進(礦版本與最低位第一):
01.Initialization 0xffffffff的
02.Shift < < 0fffffffe
03.Place該單個1的0xffffffff
04.XOR 0xfb3ee248
05 .Shift < < 0xf67dc490
06.XOR 0xf2bcd927
07.Shift < < 0xe579b24e
08.XOR 0xe1b8aff9
09.Shift < < c3715ff2
10.XOR 0xc7b04245
11.Shift < < 0x8f60848a
12.XOR 8ba1993d
13.Shift < < 0x1743327a
14.XOR 0x13822fcd
15 .Shift < < 0x27045f9a
16.Shift < < 0x4e08bf34
17.Reflect 0x2cfd1072
18.XOR(爲0xffffffff)0xd302ef8d(結果)

請幫幫忙!它有什麼問題?

回答

0

最後,我收到了回覆。花了很多時間,但我改造吧))與任何人,誰需要它

分享:
1.取前4個字節的信息(如果小於4字節 - 加個零)。可能你需要反映每個字節的位數(我必須,但我認爲這取決於特定的體系結構)。把它放入註冊表(uint)。
2.使寄存器異或0xFFFFFFFF。
3.向左移一位。
4.將下一個消息的位(最低的一個第一)註冊的右側。
5.如果轉移位爲1,低於註冊XOR 0x04C11DB7。
6.執行步驟3-5直到消息結束。
7.執行步驟3-5 32個0位(如果消息是小於32位,比這個數目必須與輸入長度對應)。
7.反映整個寄存器中的位。
8.使寄存器異或0xffffffff。

這就是它 - 你有CRC32,所有在線計算器顯示和,至少,糾正放氣,PNG等