我需要将byte[]
大小为 4 的 a 转换为我的 Android 应用程序的 long 类型。byteArrayToLong(byte_array)
我在包中找到了一个函数java.io.Bits
,但它在我的应用程序中不起作用。
还有其他替代功能吗?
使用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);
另外,请记住 Javalong
的长度为 8 个字节。对于 4 个字节,一个int
就足够了。
想到三个选项:
根据字节顺序,您可能必须反转数组。
将大小小于 8 字节的byte[ ]转换为long类型时
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(array)将放置 4 个字节
缓冲区 = {1,0,0,0,0,0,0,0}
^
|
现在缓冲区的位置是 4
3.字节顺序可根据需要为LITTLE_ENDIAN或BIG_ENDIAN 。
4. buffer.rewind() 回退缓冲区并将位置设置为零,
缓冲区 = {1,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();