我试图将此C++校验和转换为Java,但暂时失败。我究竟做错了什么?将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位,所以我用长整型得到一个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();
}
谢谢大家的帮忙!
没有详细看这个,你有没有保证字节顺序是正确的? – NPE
那里有什么&0xFF? – themel
鉴于您提出了“应该做什么?”这个问题,我建议您退后一步,问自己是否应该首先使用它。网络非常适合查找代码片段,但个人而言,我希望在我准备将它们包含在自己的工作中之前了解他们正在做什么。 – PeteH