读书人

JAVA校验和算法和C++的结果不同解决方

发布时间: 2012-01-16 23:36:51 作者: rapoo

JAVA校验和算法和C++的结果不同
近日小弟又碰到一个问题,被捆饶许久。现在此想各位求助,还往不吝赐教。小弟比较穷,倾囊相送20分以表谢意。

现在需要做一个程序与现有的软件通信。现有的软件是C++写的,其中通信消息中包含的校验和算法是从网络上找来的,本身是错误的,但是现在已经发版本了没法修改,所以我也不得不照着写个java版的错误校验和算法。可是完成后计算出的值却始终不同。我也查不出是哪的问题。
c++版本:
//CheckSum:计算校验和的子函数
USHORT CheckSum(USHORT *buffer,int size)
{
USHORT cksum=0;
while(size > 1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if(size) cksum += *buffer;
cksum = (cksum > > 16) + (cksum & 0xffff);
cksum += (cksum > > 16);

return ~cksum;
}
=================================================================
java版本
public char checkSum(byte[] buffer, int length){
char cksum=0;
int k=0;
while(length> 1){
if (k> (length/2)) break;
cksum += (char) ((buffer[k*2] < <8)+ buffer[k*2+1]);
length-=2;
k+=1;


}
if(length> 0) cksum+=(char)(buffer[k*2] < <8);
cksum=(char) ((cksum> > 16)+(cksum&0xffff));
cksum+=(cksum> > 16);
cksum=(char)Integer.toBinaryString(~cksum)
return cksum;
}
==================================================================
其实两个算法中这两句都是废的,因为USHORT和CHAR都是16位的。
cksum=(char) ((cksum> > 16)+(cksum&0xffff));
cksum+=(cksum> > 16);
大家帮我看看为什么结果不同,问题到底在哪?

[解决办法]
buffer[k*2+1]是byte类型,-128--+127,如果>127,将变成负数
(buffer[k*2] < <8)| (buffer[k*2+1]&0xffff)用位运算就没问题了

读书人网 >J2SE开发

热点推荐