我需要将大小为4的byte[]
转换为我的Android应用的长类型。我在byteArrayToLong(byte_array)
包中找到了一个函数java.io.Bits
,但它在我的应用程序中无效。
还有其他替代功能吗?
答案 0 :(得分:2)
使用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方法呢?为简单起见:不是按位移位识别字节到长字的转换,而是用简单的英语阅读这里发生的事情。
答案 1 :(得分:2)
医生的回答有效,但我会做 sans 循环。
对于小端(最可能的情况):
long val = b[0] | ((int)(b[1]) << 8) | ((int)(b[2]) << 16) | ((int)(b[3]) << 24);
对于big-endian:
long val = b[3] | ((int)(b[2]) << 8) | ((int)(b[1]) << 16) | ((int)(b[0]) << 24);
另外,请记住Java long
长度为8个字节。对于4个字节,int
就足够了。
答案 2 :(得分:1)
答案取决于您的第一个字节是最小字节还是最重要的字节。
如果第一个字节最重要:
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
。
答案 3 :(得分:1)
有三种选择:
根据字节顺序,您可能需要反转数组。
答案 4 :(得分:0)
将大小小于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个字节。
buffer = {0,0,0,0,0,0,0,0}
2. put(array)将放置4个字节
buffer = {1,0,0,0,0,0,0,0}
^
|
现在缓冲区的位置是4
3.Byte order cab根据要求 LITTLE_ENDIAN 或 BIG_ENDIAN 。
4. buffer.rewind()将缓冲区和位置重新设置为零,
buffer = {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();