java.util.zip.CRC32 中的 CRC-32 实现
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
CRC-32 是在包文档中指示的 java.util.zip 在 RFC 1952。 RFC 1952 按照 ISO 3309 中的规定定义了 CRC32,但我找不到免费的副本来链接到您。然而 RFC 1952 还指出 ITU-T 建议 V.42 指定了相同的实现。
特别是所使用的多项式是
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
根据来源:
RFC1952 可以在此处找到,但提供了相当技术性的阅读。
CRC 的初始值为
0xFFFFFFFF
,并且 CRC 表是在第一次将类加载到 VM 上时构建的。According to the source:
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.使用互联网上的一些工具 ( http://www.sunshine2k.de/coding/ javascript/crc/crc_js.html )我发现了 CRC32 参数的组合,其给出的结果与从 Java 获得的结果相同:
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:
当前接受的答案不正确。
Java的CRC32类的初始值为0,而不是0xFFFFFFFF,从重置函数的源代码中可以看出:
https://github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/classes/java/util/zip/CRC32.java#L81
我做了一个快速的暴力 -强制搜索,结果发现用值
0xFFFFFFFF
更新 CRC 实际上会产生相同的值。因此,如果您希望 CRC32 算法具有初始值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:
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 value0XFFFFFFFF
, just do: