首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

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

2012-01-16 
JAVA校验和算法和C++的结果不同近日小弟又碰到一个问题,被捆饶许久。现在此想各位求助,还往不吝赐教。小弟比

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)用位运算就没问题了

热点排行