CRC32 计算(我很绝望)

  • 本文关键字:绝望 计算 CRC32 crc32
  • 更新时间 :
  • 英文 :


我已经坚持了太久
我已经读了好几遍《CRC错误检测算法的无痛指南》。也许我还没有完全理解理论,但实践似乎晴空万里,但有些地方出了问题
我不关心代码和特定的实现,而是概念性的(一种简单的方法)

我这样做:
1.取一个字节
2.取一个uint,用0xffffff填充
3.检查最高位是否为1。
4.向左移动一位
5.放入源字节中的下一位
6.如果Step3检查为true,则将其与0x04C11DB7进行异或。
7.数据结束后,反向(反映)工作uint
8.将其与0xffffffff

进行异或

它有效。。。但只有零(我检查了1、2、3、4个字节的零)。但当我取一个字节0x01时,它失败了(在线计算器显示不同的结果)。我就是不明白我做错了什么

循序渐进(先挖掘最低位的版本):
01.初始化0xffffffff
02.移位<lt;0ffffffe
03.放置单个1 0xfffffffff
04.XOR 0xfb3ee248
05.移位<lt;0xf67dc490
06.XOR 0xf2bcd927
07.移位<lt;0xe579b24e
08.XOR 0xe1b8aff9
09.Shift<lt;c3715ff2
10.XOR 0xc7b04245
11.移位<lt;0x8f60848a
12.8b1993d异或
13.移位<lt;0x1743327a
14XOR 0x13822fcd
15.移位<lt;0x27045f9a
16.移位<lt;0x4e08bf34
17.反射0x2cfd1072
18.XOR(0xffffffff)0xd302ef8d(结果)

请帮忙!它怎么了?

我终于拿到了收据。这花了很多时间,但我重新发明了)

与任何需要它的人共享:
1.从消息中取出前4个字节(如果小于4个字节,则加0)。可能你需要在每个字节中反映比特(我必须这样做,但我认为这取决于特定的体系结构)。将其放入寄存器(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等。

最新更新