这里有个方法,是把一个网络传输上的4个字节转为一个整型数,如00CCBBDD 转为整型数就是DDBBCC00, 网络上是低字节在前,操作系统是高字节在前。   
     /**
      * 字节数组转换为整型数, 低字节在前
      * @param b  字节数组
      * @return 整型数
      */
    public static int byte2Int(byte[] b)
    {
     int ret = 0;
     int min = Math.min(4, b.length);
     for(int i=0; i<min; i++) {
     ret +=  b[min-i-1];
     if(i<min-1) ret<<=8;
     }
     return ret;
    }
函数很简单,但运行的结果却不对,如00CCBBDD 转的结果却是 DCBACC00,我想了很久才知道答案,请各位思考一下,相信你一定能找到答案。PS:这个问题是很隐蔽的,说不定你在平时的编程中就会遇到。

解决方案 »

  1.   

    不同设备的主机字节序不同,x86CPU的都是小端字节序,PPC手机是大端字节序
      

  2.   

    byte为有符号型,
    大于127的转化为int时前面全部补 1
    小于128的转化为int时前面全部补 0
    应改为
        public static int byte2Int(byte[] b)
        {
            int ret = 0;
            int min = Math.min(4, b.length);
            for(int i=0; i<min; i++) {
        if(b[min-1-i]<0)
         ret +=256+ (int)b[min-i-1];
         else
         ret +=(int)b[min-i-1];                  
                if(i<min-1)    ret<<=8;  
            }
            return ret;
        }
      

  3.   

    /**
     * 将 Little-Endian 的字节数组转为 int 类型的数据<br />
     * Little-Endian 表示高位字节在低位索引中
     * @param bys       字节数组
     * @param start     需要转换的开始索引位数
     * @param len       需要转换的字节数量
     * @return  指定开始位置和长度以 LE 方式表示的 int 数值
     */
    public static int bytes2IntLE(byte[] bys, int start, int len) {
        return bytes2Int(bys, start, len, false);
    }/**
     * 将 Big-Endian 的字节数组转为 int 类型的数据<br />
     * Big-Endian 表示高位字节在高位索引中
     * @param bys       字节数组
     * @param start     需要转换的开始索引位数
     * @param len       需要转换的字节数量
     * @return  指定开始位置和长度以 BE 方式表示的 int 数值
     */
    public static int bytes2IntBE(byte[] bys, int start, int len) {
        return bytes2Int(bys, start, len, true);
    }private static int bytes2Int(byte[] bys, int start, int len, boolean isBigEndian) {
        int n = 0;
        for(int i = start, k = start + len % (Integer.SIZE / Byte.SIZE + 1); i < k; i++) {
            n |= (bys[i] & 0xff) << ((isBigEndian ? (k - i - 1) : i) * Byte.SIZE);
        }
        return n;
    }
      

  4.   


    这位正解,byte是有符号的。强制转换的时候很容易忽略这点。负数强制转换的时候前面是补1的。不信你测试下面的代码:  int a = 0xbb;
      System.out.println(Integer.toHexString(a));    //输出 bb
      int b = (int) 0xbb;
      System.out.println(Integer.toHexString(b)); //输出 ffffffbb
    所以上面的代码只需要做一个小小的修改就可以。 /**
          * 字节数组转换为整型数, 低字节在前
          * @param b  字节数组
          * @return    整型数
          */
        public static int byte2Int(byte[] b)
        {
            int ret = 0;
            int min = Math.min(4, b.length);
            for(int i=0; i<min; i++) {
                ret += 0x000000FF & b[min-i-1];
                if(i<min-1)    ret<<=8;
            }
            return ret;
        }结贴咯···