【发布时间】:2012-01-25 14:07:47
【问题描述】:
Java CRC-32 类中使用了哪种 CRC-32 算法? java doc 没有提供任何细节。使用的多项式和计算的初始值是什么?
【问题讨论】:
Java CRC-32 类中使用了哪种 CRC-32 算法? java doc 没有提供任何细节。使用的多项式和计算的初始值是什么?
【问题讨论】:
CRC-32 是在 java.util.zip 的包文档中指定的,将在 RFC 1952 中指定。 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
【讨论】:
使用来自 Internet (http://www.sunshine2k.de/coding/javascript/crc/crc_js.html) 的一些工具,我发现 CRC32 参数的组合与从 Java 获得的结果相同:
【讨论】:
currently accepted answer 不正确。
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
【讨论】:
new CRC32().getValue() == 0 是初始值0xFFFFFFFF 的预期结果(因为~0xFFFFFFFF == 0)。该实现可能只是采用捷径来计算补码中的所有内容,因此输出不必做任何事情。这也是为什么reset() 设置crc = 0 而不是crc = 0xFFFFFFFF。