gpt4 book ai didi

java - 将 C++ 校验和函数转换为 Java

转载 作者:太空宇宙 更新时间:2023-11-04 12:01:46 28 4
gpt4 key购买 nike

我正在尝试将此 C++ 校验和转换为 Java,但暂时失败了。我做错了什么?

它应该做什么?它应该为 OpenGL 中的缓冲区返回正校验和

这是 C 部分。

DWORD QuickChecksum(DWORD *data, int size){

if(!data) {
return 0x0;
}

DWORD sum;
DWORD tmp;
sum = *data;

for(int i = 1; i < (size/4); i++)
{
tmp = data[i];
tmp = (DWORD)(sum >> 29) + tmp;
tmp = (DWORD)(sum >> 17) + tmp;
sum = (DWORD)(sum << 3) ^ tmp;
}

return sum;
}

这是我在 Java 中尝试过的。据我所知,DWORD 是 32 位的,所以我在 long 中使用 int 来获得一个 unsigned int,这应该在 java 中使用 >>>?

我一直在关注这个问题,以至于我对它视而不见。

public static long getChecksum(byte[] data, int size) {
long sum, tmp;
sum = getInt(new byte[]{data[0], data[1], data[2], data[3]},true) & 0xFF;
for(int I = 4; I < data.length; I += 4)
{
tmp = getInt(new byte[]{data[I],data[I+1],data[I+2],data[I+3]},true) & 0xFF;
tmp = (sum >>> 29) + tmp;
tmp = (sum >>> 17) + tmp;
sum = (sum << 3) ^ tmp;
}
return sum & 0xFF;
}

private static int getInt(byte[] bytes, boolean big) {
ByteBuffer bb = ByteBuffer.wrap(bytes);
return bb.getInt();
}

谢谢大家的帮助!

最佳答案

明显的错误是,在三个地方,您将输入字和最终校验和与 0xff 进行了 AND,丢失了高 24 位。据推测,您正在尝试将 long 值减少到 32 位,这需要与 0xfffffffL 进行 AND 运算。在执行此操作之前,您还需要将 getInt() 的返回值转换为 long,否则您仍然会得到您试图避免的符号扩展。

我的 Java 有点生疏,但我相当确定只要您使用 >>>,坚持使用 int 就会得到正确的结果右移(就像你一样)。

您还有一个错误,您无条件读取前四个字节而不检查输入是否为空。

您还需要确保输入的字节数是 4 的倍数;通过检查长度,或通过更改它以使用 int[] 而不是像 C 版本那样使用 byte[] 。当然,也不需要 size 参数,因为 Java 数组带有它们的大小。

以下应该给出与 C 版本相同的结果:

public static int checksum(int[] data)
{
if (data.length == 0) {
return 0;
}

int sum = data[0];
for (int i = 1; i < data.length; ++i) {
int tmp = data[i];
tmp = (sum >>> 29) + tmp;
tmp = (sum >>> 17) + tmp;
sum = (sum << 3) ^ tmp;
}

return sum;
}

关于java - 将 C++ 校验和函数转换为 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13839091/

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