我从字节数组转换为long的代码不起作用

时间:2015-01-25 10:16:05

标签: java

我在java中编写代码,从字节数组转换为long,代码在这里:

public static long bTol(byte[] b_arr) {
        long res = 0;
        for (int i = 0; i < b_arr.length; i++) {
            res += ((b_arr[i] & 0xFFFFFFFFFFFFFFFFL) << ((b_arr.length - 1 - i) * 8));
        }
        return res;
    }

当我运行此代码时,我获得了不同的数字,但我无法理解什么是问题

2 个答案:

答案 0 :(得分:0)

您必须屏蔽单个字节,否则符号扩展会污染您的结果:

public static long bTol(byte[] b_arr) {
    long res = 0;
    for (int i = 0; i < b_arr.length; i++) {
        res += (long)(b_arr[i] & 0xFF) << ((b_arr.length - 1 - i) * 8);
    }
    return res;
}

您也可以使用可用的方法(假设字节数组的长度为8,应该如此):

public static long bToL(byte[] b_arr) {
    ByteBuffer buf = ByteBuffer.allocate( b_arr.length );
    buf.put( b_arr );
    return buf.getLong(0);
}

答案 1 :(得分:0)

尝试替换

res += ((b_arr[i] & 0xFFFFFFFFFFFFFFFFL) << ((b_arr.length - 1 - i) * 8));

由此:

res += ((long) b_arr[i] & 0xFFL) << (8 * i);