我的问题是使用此实现时;Java CRC32 计算不同于 C# 使用查找表的 CRC32 计算。
以下是我正在使用的 CRC32 代码:
public static int CalculateCRCWithTable(byte[] data){
int crc = 0;
for (byte b : data) {
crc = CRCTable[(crc & 0xff) ^ (b & 0xff)] ^ (crc >>> 8) ;
}
//crc = crc ^ 0xffffffff; // flip bit/sign
return (crc);
}
从文件中读取:
public static byte[] readFromFileToByteArray(String fileName) throws IOException {
BufferedInputStream fis = new BufferedInputStream(new FileInputStream(fileName));
byte [] bytes = IOUtils.toByteArray(fis);
for (byte b : bytes){
b = (byte) (b & 0xff);
}
return bytes;
}
当用一个简单的文本文件测试 Java CRC32 计算时,CRC 计算(有时)是正确的,与 C# 相同,但指向一个可执行/二进制文件,然后我开始看到不同的结果。
(将示例数据从评论移到问题部分): 字符串:“简单 CRC32 计算测试” 十六进制值:
73 69 6D 70 6C 65 20 43 52 43 33 32 20 63 61 6C 63 75 6C 61 74 69 6F 6E 20 74 65 73 74
两者都使用查找表实现:
- “预期/正确”C# 的 CRC32 计算:3347067236
- Java CRC32 计算:-947900060
在一个类似的线程中,有人提到为 Java 实现无符号整数 32 应该可以解决这个问题。
任何指针将不胜感激,谢谢。
已解决:感谢 Mark 的验证!考虑到这一点,只需以下内容即可获得正确的 CRC32 计算:
String tmp = Integer.toHexString(crc);
long lCRC = Long.parseLong(tmp, 16);