我的问题是使用这个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
两者都使用查找表实现:
在一个类似的线程中,有人提到为Java实现无符号整数32应该可以解决这个问题。
任何指针都将非常感谢,谢谢。
解决: 谢谢Mark的验证!考虑到这一点,下面只需要获得正确的CRC32计算:
String tmp = Integer.toHexString(crc);
long lCRC = Long.parseLong(tmp, 16);
答案 0 :(得分:1)
您在评论中提供的两个值(它们应移到问题中)在低32位中完全相同。 3347067236 = 2 32 - 947900060.它们都是0xc7803164。你没有问题。