0

我的问题是使用此实现时;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);
4

1 回答 1

1

您在评论中提供的两个值(它们应该移到问题中)在它们的低 32 位中完全相等。3347067236 = 2 32 - 947900060。它们都是 0xc7803164。你没有问题。

于 2013-01-07T18:47:09.513 回答