java - 使用位操作将 Byte[] 转换为 Long

标签 java byte bit-manipulation long-integer

我有一个 byte[] 将字节保存为 long。我想使用位运算将其转换为长整数。我尝试过以下方法:

byte[] b = new byte[]{127, 127};
long result = 0;
for (int i = 0; i < b.length; i++) {
    result <<= 8; // this is the same as l = l << 8;
    result |= (short)b[i] & 0xFF;
}

适用于正字节。但是字节可以是正数也可以是负数,因此它不起作用。

举个例子:

byte[] b = new byte[]{-1, 2};
long result = 0;
for (int i = 0; i < b.length; i++) {
    result <<= 8; // this is the same as l = l << 8;
    result |= (short)b[i] & 0xFF;
}
System.out.println(result);
System.out.println(new BigInteger(b).longValue());

打印 65282 和 -254。我相信 BigInteger 的结果是正确的,但由于内存问题我不想使用它。

知道我做错了什么吗?

最佳答案

这取决于您的应用程序需要什么。

byte[] b = new byte[] { -1, 2 }

另一种看待此问题的方法是使用十六进制数 0xFF02。这是否表示一个带符号的 64 位值 (65282)?或者有符号的 16 位值 (-254)?或者一个无符号的 16 位值(又是 65282)?或者无符号的 64 位值(仍然是 65282)?

您的代码将其视为带符号的 64 位值。 BigInteger将其视为有符号的 16 位值。 BigInteger有另一个构造函数将字节数组视为大小,使用另一个参数作为符号: new BigInteger(+1, b)结果是 65282。

关于java - 使用位操作将 Byte[] 转换为 Long,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22565560/

相关文章:

java - 有没有办法从属性文件值设置其余配置 header ?

java - 方法——继续

byte - 为什么Big Endian以小字节结尾?

python - 在 Python 中产生 2 次方的按位运算

java - 在自定义启动器中访问 spring 应用程序名称

c# - 合并2个字节

c++ - 从内存地址获取字节?

c++ - 检查是否设置了 k 中 1 到 n 之间的所有位

java - 一条语句中的多个按位移位

Java线程并发