我需要将大小为 4 的byte[]
转换为为我的 Android 应用程序键入 long。我在java.io.Bits
包中找到了一个函数byteArrayToLong(byte_array)
,但它在我的应用程序中不起作用。
还有其他替代功能吗?
使用 java.nio.ByteBuffer
:
byte[] data = new byte[] {50, -106, 40, -22};
ByteBuffer buffer = ByteBuffer.wrap(data);
System.out.println(buffer.getLong());
编辑
当然,@Kaito是对的:你需要一个 8 字节的数组。此外,正如其他人提到的,您可以选择读取字节的顺序(默认情况下BIG_ENDIAN
):
byte[] data = new byte[] {50, -106, 40, -22, 0, 0, 0, 0};
ByteBuffer buffer = ByteBuffer.wrap(data);
buffer.order(ByteOrder.BIG_ENDIAN);
System.out.println(buffer.getLong()); // 3645145933890453504
buffer = ByteBuffer.wrap(data);
buffer.order(ByteOrder.LITTLE_ENDIAN);
System.out.println(buffer.getLong()); // 3928528434
另外,为什么更喜欢 API 方法?为了简单起见:与其在按位移位中识别字节到长转换,不如用简单的英语阅读这里发生的事情。
答案取决于您的第一个字节是最小字节还是最高有效字节。
如果第一个字节最重要:
long val = 0;
for (int i = 0; i < YourByte.length; i++)
{
val = (val << 8) + (YourByte[i] & 0xff);
}
如果第一个字节是最低有效字节:
long val = 0;
for (int i = 0; i < YourByte.length; i++)
{
val += ((long) YourByte[i] & 0xffL) << (i*8);
}
编辑:
处理超过 8 个字节时,请使用 BigInteger
而不是 long
。
医生的答案有效,但我会这样做,没有循环。
对于小端序(最有可能的情况):
long val = b[0] | ((int)(b[1]) << 8) | ((int)(b[2]) << 16) | ((int)(b[3]) << 24);
对于大端序:
long val = b[3] | ((int)(b[2]) << 8) | ((int)(b[1]) << 16) | ((int)(b[0]) << 24);
另外,请记住,Java long
的长度为 8 个字节。对于 4 个字节,一个int
就足够了。
我想到了三个选项:
- 将数组传递给 BigInteger 构造函数,然后从 BigInteger 中获取长整型值
- 用另外 4 个字节填充数组并使用 ByteBuffer.wrap 然后 getLong
- 通过将每个字节移动到位来手动构造它。
根据字节序,您可能需要反转数组。
大小小于 8 字节的字节 [ ] 转换为长整型时
public static ByteBuffer byteArraytoByteBuffer(int capacity,byte[] array)
{
ByteBuffer buffer = ByteBuffer.allocate(capacity).put(array).order(ByteOrder.LITTLE_ENDIAN);
buffer.rewind();
return buffer;
}
然后
byte[] input = new byte[]{1,0,0,0};
long value = byteArraytoByteBuffer(8,input).getLong();
1.ByteBuffer.allocate(capacity) 为 long 类型分配 8 个字节。
缓冲区 = {
0,0,0,0,0,0,0,0}2.put(数组)将放置4个字节
缓冲区 = {1,0,0,0,0,0,0,0,0}
^
|
现在缓冲区的位置是 4
3.字节顺序cab可根据需要LITTLE_ENDIAN或BIG_ENDIAN。
4.buffer.rewind() 将缓冲区和位置设置为零,
缓冲区 = {1,0,0,0,0,0,0,0,0}
^
|
如果未完成buffer.rewind()操作,则会发生缓冲区下溢。因为位置在 4,所以当调用 getLong() 时,它的起始索引为 4。
相同的代码可用于将 byte[ ] 转换为 int
byte[] input = new byte[]{1,0,0,0};
long value = byteArraytoByteBuffer(4,input).getInt();