近日小弟又碰到一个问题,被捆饶许久。现在此想各位求助,还往不吝赐教。小弟比较穷,倾囊相送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);  
大家帮我看看为什么结果不同,问题到底在哪?

解决方案 »

  1.   

    感觉这句有问题:cksum  +=  (char)  ((buffer[k*2]<<8)+  buffer[k*2+1]);  
    不理解C++的是什么意思
      

  2.   

    C++里USHORT  也是8位的,刚刚看了下的
      

  3.   

    C++的USHORT是16位!是无符号short型(unsigned short),范围是0--65525 !
    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++的对应上了。
      

  4.   

    上帖有手误(unsigned  short),范围是0--65535  !  
      

  5.   

    (buffer[k*2]<<8)+  buffer[k*2+1]
    (buffer[k*2]<<8)| (buffer[k*2+1]&0xffff)
      

  6.   

    chinajava(chinajava) 能解释的详细些吗?不明白你的意思.
      

  7.   

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

  8.   

    chinajava(chinajava) : 谢谢你指出的这个错误,我当初没考虑到。可是我修改了这点,但算出的结果仍然不一致,这个不是问题的根本原因。
      

  9.   

    ((buffer[k*2]&0xff) <<8) | (buffer[k*2+1]&0xff)