近日小弟又碰到一个问题,被捆饶许久。现在此想各位求助,还往不吝赐教。小弟比较穷,倾囊相送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);
大家帮我看看为什么结果不同,问题到底在哪?
现在需要做一个程序与现有的软件通信。现有的软件是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);
大家帮我看看为什么结果不同,问题到底在哪?
解决方案 »
- String 类
- AWT界面加载图片-----------------------------题目长才有人看!!
- 哪个版本的JBuilder可以运行JDK1.6
- “[”的问题。。。。。。。。
- 谁有corejava的类库?
- 请问我要问ASP的问题, 应该把帖子放在哪个大类里.
- 怎么将一个String字符串(含中文)生成成一副图片(jpg格式最好)?盼各位指点一二!!!
- 如何把javadoc的 -version、-author选项打开?
- 最简单的HELLO WORLD 怎么出错了……
- 用java解析csv文件遇到的问题
- 请问如何把两个字节数组合并成一个字节数组?
- 关于extends和implements创建的内部类的问题,谢谢帮忙
不理解C++的是什么意思
java的char也是16位,范围是0-65535 java版中的:
cksum += (char) ((buffer[k*2]<<8)+ buffer[k*2+1]);
//因为byte[]中每次提取一个byte,c++里的指针是USHORT的,一次提取16位长度。所以为了对应就提取两个byte,分别是buffer[k*2]和buffer[k*2+1],然后先提取的byte左移8位和后提取的相加组成一个16位的char,这样就能和C++的对应上了。
(buffer[k*2]<<8)| (buffer[k*2+1]&0xffff)
(buffer[k*2]<<8)| (buffer[k*2+1]&0xffff)用位运算就没问题了