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

发布于 2024-12-28 21:44:39 字数 79 浏览 0 评论 0原文

Java CRC-32 类中使用哪种 CRC-32 算法? java 文档没有提供任何细节。使用的 Polynomail 和计算的初始值是多少?

Which CRC-32 algorithm is used in the Java CRC-32 class ? The java doc does not give any details. What is the polynomail used and the initial value for calculaton ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

场罚期间 2025-01-04 21:44:39

CRC-32 是在包文档中指示的 java.util.zipRFC 1952。 RFC 1952 按照 ISO 3309 中的规定定义了 CRC32,但我找不到免费的副本来链接到您。然而 RFC 1952 还指出 ITU-T 建议 V.42 指定了相同的实现。

特别是所使用的多项式是

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

CRC-32 is a indicated in the package docs for java.util.zip to be specified in RFC 1952. RFC 1952 defines CRC32 as specified in ISO 3309 which I could not find a free copy of to link you to. However RFC 1952 also indicates that section 8.1.1.6.2 of ITU-T recommendation V.42 specifies the same implementation.

In partcular the polynomial being used is

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
雾里花 2025-01-04 21:44:39

根据来源

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

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

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

According to the source:

Computes CRC32 data checksum of a data stream. The actual CRC32
algorithm is described in RFC 1952 (GZIP file format specification
version 4.3). Can be used to get the CRC32 over a stream if used
with checked input/output streams.

The RFC1952 can be found here, but presents a quite technical read.

The initial value for the CRC is 0xFFFFFFFF, and the CRC table is built the first time the class is loaded on the VM.

老旧海报 2025-01-04 21:44:39

使用互联网上的一些工具 ( http://www.sunshine2k.de/coding/ javascript/crc/crc_js.html )我发现了 CRC32 参数的组合,其给出的结果与从 Java 获得的结果相同:

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

Using some tools from Internet ( http://www.sunshine2k.de/coding/javascript/crc/crc_js.html ) I've found a combination of CRC32 parameters that gives the same results as obtained from Java:

  • Input reflected, result reflected.
  • Polynomial: 0x04C11DB7.
  • Initial value: 0xFFFFFFFF.
  • Final XOR: 0xFFFFFFFF
云归处 2025-01-04 21:44:39

当前接受的答案不正确。

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

The currently accepted answer is incorrect.

The initial value for Java's CRC32 class is 0, not 0xFFFFFFFF, as can be seen in the source code for the reset function:

/**
 * 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

I did a quick brute-force search, and it turns out that updating the CRC with the value 0xFFFFFFFF will actually yield that same value. So if you'd like the CRC32 algorithm to have the initial value 0XFFFFFFFF, just do:

    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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文