3

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

还有其他替代功能吗?

4

5 回答 5

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 方法?为了简单起见:您可以用简单的英语阅读这里发生的事情,而不是识别按位移位的字节到长转换。

于 2012-06-19T19:25:19.540 回答
2

答案取决于您的第一个字节是最低有效字节还是最高有效字节。

如果第一个字节是最重要的

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

于 2012-06-19T19:25:48.900 回答
2

医生的回答有效,但我会这样做没有循环。

对于小端(最可能的情况):

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就足够了。

于 2012-06-19T19:30:57.790 回答
1

想到三个选项:

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

根据字节顺序,您可能必须反转数组。

于 2012-06-19T19:28:18.130 回答
0

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

于 2017-06-30T05:02:54.710 回答