gpt4 book ai didi

java - 另一个 Java CRC32 实现相关问题

转载 作者:行者123 更新时间:2023-12-01 14:57:20 29 4
gpt4 key购买 nike

我的问题是使用这个 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 计算:-947900060

在类似的线程中,有人提到为 Java 实现无符号整数 32 应该可以修复差异。

任何指点都将不胜感激,谢谢。

已解决:感谢马克的验证!考虑到这一点,只需执行以下操作即可获得正确的 CRC32 计算:

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

最佳答案

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

关于java - 另一个 Java CRC32 实现相关问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14187955/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com