我有一个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
的结果是正确的,但由于内存问题,我不想使用它。
知道我做错了吗?
答案 0 :(得分:1)
这取决于您的应用程序需要什么。
byte[] b = new byte[] { -1, 2 }
另一种看待它的方法是十六进制数0xFF02。这是否代表带符号的64位值(65282)?还是带符号的16位值(-254)?或者是无符号的16位值(再次为65282)?或者是无符号的64位值(仍为65282)?
您的代码将其视为带符号的64位值。 BigInteger
将其视为带符号的16位值。 BigInteger
有另一个构造函数将字节数组视为幅度,使用符号的另一个参数:new BigInteger(+1, b)
将导致65282。