我如何在android中将字节数组转换为long

时间:2012-06-19 19:15:43

标签: java android

我需要将大小为4的byte[]转换为我的Android应用的长类型。我在byteArrayToLong(byte_array)包中找到了一个函数java.io.Bits,但它在我的应用程序中无效。

还有其他替代功能吗?

5 个答案:

答案 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)

有三种选择:

  1. 将数组传递给BigInteger构造函数,然后从BigInteger中获取long值
  2. 用另外4个字节填充数组并使用ByteBuffer.wrap然后使用getLong
  3. 通过将每个字节移动到位来手动构造它。
  4. 根据字节顺序,您可能需要反转数组。

答案 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();