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



我用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;
    }

运行此代码时我得到不同的数字,但我不明白问题是什么

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

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);
}

尝试替换

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

通过这个:

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

最新更新