如何在安卓中将字节数组转换为长整型



我需要将大小为 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就足够了。

我想到了三个选项:

  1. 将数组传递给 BigInteger 构造函数,然后从 BigInteger 中获取长整型值
  2. 用另外 4 个字节填充数组并使用 ByteBuffer.wrap 然后 getLong
  3. 通过将每个字节移动到位来手动构造它。

根据字节序,您可能需要反转数组。

大小小于 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_ENDIANBIG_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();

最新更新