【发布时间】:2012-12-12 11:48:39
【问题描述】:
我正在尝试将此 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 在那里做什么?
-
鉴于您提出“它应该做什么?”的问题,我建议您退后一步,先问问自己是否应该首先使用它。网络非常适合查找代码的 sn-ps,但就我个人而言,我喜欢在准备将它们包含到我自己的工作中之前了解它们在做什么。
-
@PeteH 这不仅仅是我从互联网上找到的 sn-p,它已经在生产代码中使用了很长时间。 (鉴于我没有编写原始代码)但是由于在应用程序的开发中从 C 到 Java 的变化,我仍然需要将那段特定的代码转换为 Java。这就是为什么我知道 C 部分在这种情况下确实给出了正确的结果。