我有一个 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/