5

Java CRC-32 类中使用了哪种 CRC-32 算法?java doc 没有提供任何细节。使用的多项式邮件和计算的初始值是什么?

4

4 回答 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 回答
5

根据消息来源

计算数据流的 CRC32 数据校验和。RFC 1952(GZIP 文件格式规范版本 4.3)中描述了实际的 CRC32 算法。如果与检查的输入/输出流一起使用,可用于通过流获取 CRC32。

RFC1952 可以在这里找到,但提供了相当技术性的阅读。

CRC 的初始值为0xFFFFFFFF,并且在第一次将类加载到 VM 时构建 CRC 表。

于 2012-01-25T14:18:32.550 回答
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;
}

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

我做了一个快速的蛮力搜索,结果发现用该值更新 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 回答