在Java CRC-32类中使用哪种CRC-32算法? java doc没有提供任何细节。什么是使用的polynomail和calculaton的初始值?
答案 0 :(得分:5)
在java.util.zip中指定的RFC 1952包文档中指明了CRC-32。 RFC 1952定义了ISO 3309中指定的CRC32,我找不到链接到您的免费副本。但是,RFC 1952也指出ITU-T recommendation 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
答案 1 :(得分:4)
根据source:
计算数据流的CRC32数据校验和。实际的CRC32 RFC 1952(GZIP文件格式规范)中描述了算法 版本4.3)。如果使用,可用于在流上获取CRC32 检查输入/输出流。
可以找到RFC1952 here,但提供了非常技术性的阅读。
CRC的初始值为0xFFFFFFFF
,并且在第一次在VM上加载类时构建CRC表。
答案 2 :(得分:1)
使用Internet上的一些工具(http://www.sunshine2k.de/coding/javascript/crc/crc_js.html)我发现CRC32参数的组合可以得到与Java相同的结果:
答案 3 :(得分:0)
Java的CRC32类的初始值为0,而不是0xFFFFFFFF,如复位函数的源代码所示:
/**
* Resets CRC-32 to initial value.
*/
public void reset() {
crc = 0;
}
我做了一个快速的暴力搜索,结果发现用值0xFFFFFFFF
更新CRC实际上会产生相同的值。因此,如果您希望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