【发布时间】:2014-03-21 17:28:26
【问题描述】:
我有一个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 的结果是正确的,但由于内存问题我不想使用它。
知道我做错了什么吗?
【问题讨论】:
-
你不能改用
ByteBuffer吗? -
A
long是 8 个字节,而不是 2 个。如果将负字节左移 56 位,则生成的long将为负数。您在测试中看不到它,因为您只左移了 8 位。 -
你真的想如何处理字节?在这种情况下,我 expect 他们被当作 8 位 unsigned 整数来处理,在这种情况下 65282 对我来说是有意义的......
标签: java byte bit-manipulation long-integer