我本地机java版本是“1.5.0_11”,服务器上使用的是“1.6.0_13”同样的代码在本地可以运行,可是到了服务器上报的错误是“数组越界”,这也版本有关系吗???
下面是我的代码:
byte[] rb = new byte[pack.length-8];
System.arraycopy(pack, 0, rb, 0, pack.length-8);
int flen=rb.length;
byte[] temp=new byte[8];
byte[] out=new byte[8];

int j = flen % 8;
String tempPack=new String(rb);
System.out.println("tempPack长度:"+tempPack.length());
if(j==0){
    j=flen / 8;
}else{
    j=(flen / 8 + 1);
}
for(int m = 0; m < j*8-flen; m ++){
    tempPack+=StaticString.END_FLAG;
}
byte[] tmp=tempPack.getBytes();
System.arraycopy(pack, 22, tmp, 22, 8);

for (int i = 0; i < j; i++){
    for (int k = 0; k < 8; k++){
        temp[k] ^= tmp[i*8+k];
    }
}
上面红字部分在本地打印出来的长度是“30”,在服务器上的长度是“27”,其中rb里的内容是从同一个测试机发送过来的。
这是为什么???

解决方案 »

  1.   

    我觉得问题应该在pack身上 而不是在java version
      

  2.   

    这怎么可能跟版本有关,应该优先检查代码,debug一下,先关注啦!
      

  3.   

    byte[] rb = new byte[pack.length-8]; 
    System.arraycopy(pack, 0, rb, 0, pack.length-8);
    定义的数组的长度是通过表达式计算得出的,可能是因为第一句执行完后,pack被修改了,第二句pack.length时取到的值比第一次大,导致arraycopy()执行时数组越界
      

  4.   


    是这里在做循环运算时出的错误:
    for (int i = 0; i < j; i++){ 
        for (int k = 0; k < 8; k++){ 
            temp[k] ^= tmp[i*8+k]; 
        } 

    当i=3时,K循环到3时,tmp[i*8+k]这个越界啦,因为服务器上temp的长度只有“27”。
    其中pack是个byte数组,它的内容我分别在服务器上和本地机都打印出来啦,是一模一样的。
    String tempPack=new String(rb); 
    tempPack这个字符串的内容我也打印出来看了一下,前面都一样,到了结尾是,有点不一样。
    谁能帮我解释一下呀。
      

  5.   

    问题我已经解决了,不过还是不知道为什么会出现数组越界,我把程序改了一下,没有把rb这个byte数组转换成字符串,直接对rb上做的操作,还是希望有人帮我解释一下
      

  6.   

    String(byte[]) 构造函数会用平台默认字符集来生成 String,你是不是本地机是 Windows,字符集 GBK 而服务器是 Linux,字符集 UTF-8?