java.util.zip.CRC32中的CRC-32实现

时间:2012-01-25 14:07:47

标签: java crc crc32

在Java CRC-32类中使用哪种CRC-32算法? java doc没有提供任何细节。什么是使用的polynomail和calculaton的初始值?

4 个答案:

答案 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相同的结果:

  • 反映输入,反映结果。
  • 多项式:0x04C11DB7。
  • 初始值:0xFFFFFFFF。
  • 最终XOR:0xFFFFFFFF

答案 3 :(得分:0)

currently accepted answer不正确。

Java的CRC32类的初始值为0,而不是0xFFFFFFFF,如复位函数的源代码所示:

/**
 * Resets CRC-32 to initial value.
 */
public void reset() {
    crc = 0;
}

https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/classes/java/util/zip/CRC32.java#L81

我做了一个快速的暴力搜索,结果发现用值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