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