我一直在等待太多时间......
我已多次阅读“CRC错误检测算法的无痛指南”。可能我不完全理解理论,但实践似乎像天空一样清晰,但有些不对
我不是关于代码和特定的实现,而是概念(一种简单的方法)。
我这样做:
1.取一个字节
2.取一点,用0xffffffff填充
3.检查最高位是否为1
4.向左移一位。
5.从源字节中输入下一位
6. Step3检查为真,然后将其与0x04C11DB7进行异或
7.数据结束后,反转(反映)工作uint
8.使用0xffffffff与其进行异或
它有效...但只有零(我检查了1,2,3,4个字节的零)。但是,当我取一个字节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.反映0x2cfd1072
18.XOR(0xffffffff)0xd302ef8d(结果)
请帮忙!这有什么问题?
答案 0 :(得分:0)
最后,我得到了收据。花了很多时间,但我重新发明了它))
与需要它的任何人分享:
1.从消息中取出前4个字节(如果少于4个字节 - 添加零)。可能你需要反映每个字节中的位(我必须,但我认为这取决于特定的架构)。把它放入Register(uint)。
2.使寄存器XOR为0xFFFFFFFF
3.向左移一点。
4.将下一条消息的位(最低的一位)放在寄存器的右侧
5.如果移位位为1,则寄存器为XOR 0x04C11DB7
6.执行步骤3-5直到消息结束。
7.对于32位零进行步骤3-5(如果消息小于32位,则此数字必须与输入长度一致)。
7.反映整个寄存器中的位
8.使寄存器XOR为0xffffffff。
它就是它 - 你有CRC32,所有在线计算器都显示,并且至少可以解决deflate,PNG等问题。