Java CRC-32 类中使用了哪种 CRC-32 算法?java doc 没有提供任何细节。使用的多项式邮件和计算的初始值是什么?
问问题
12850 次
4 回答
7
CRC-32 在RFC 1952中指定的java.util.zip的包文档中指示。RFC 1952 定义了 ISO 3309 中指定的 CRC32,我找不到可以链接到的免费副本。然而 RFC 1952 也指出ITU-T 建议 V.42的第 8.1.1.6.2 节规定了相同的实现。
特别是所使用的多项式是
x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1
于 2012-01-25T14:28:21.010 回答
2
使用来自 Internet ( http://www.sunshine2k.de/coding/javascript/crc/crc_js.html ) 的一些工具,我发现了 CRC32 参数的组合,其结果与从 Java 获得的结果相同:
- 输入反映,结果反映。
- 多项式:0x04C11DB7。
- 初始值:0xFFFFFFFF。
- 最终异或:0xFFFFFFFF
于 2017-07-19T18:05:17.327 回答
0
当前接受的答案不正确。
Java 的 CRC32 类的初始值为 0,而不是 0xFFFFFFFF,这可以在重置函数的源代码中看到:
/**
* Resets CRC-32 to initial value.
*/
public void reset() {
crc = 0;
}
我做了一个快速的蛮力搜索,结果发现用该值更新 CRC0xFFFFFFFF
实际上会产生相同的值。因此,如果您希望 CRC32 算法具有初始值0XFFFFFFFF
,只需执行以下操作:
CRC32 crc = new CRC32();
// Set the initial value to 0xFFFFFFFF
crc.update(new byte[]{(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF});
System.out.println("CRC: " + crc.getValue()); // prints 4294967295, which is 0xFFFFFFFF
于 2017-04-26T20:40:33.803 回答