另一个Java CRC32实现相关问题

时间:2013-01-06 23:32:20

标签: java crc32

我的问题是使用这个implementation; 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 calc:-947900060

在一个类似的线程中,有人提到为Java实现无符号整数32应该可以解决这个问题。

任何指针都将非常感谢,谢谢。

解决: 谢谢Mark的验证!考虑到这一点,下面只需要获得正确的CRC32计算:

String tmp = Integer.toHexString(crc);      
long lCRC = Long.parseLong(tmp, 16);

1 个答案:

答案 0 :(得分:1)

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