如何将字节数组转换为其数值(Java)?

2022-08-31 10:35:47

我有一个8字节的数组,我想将其转换为相应的数值。

例如:

byte[] by = new byte[8];  // the byte array is stored in 'by'

// CONVERSION OPERATION
// return the numeric value

我想要一个将执行上述转换操作的方法。


答案 1

可以使用作为java.nio包的一部分提供的缓冲区来执行转换。

此处,源数组的长度为 8,即与值相对应的大小。byte[]long

首先,将数组包装在 ByteBuffer 中,然后调用 ByteBuffer.getLong 方法来获取值:byte[]long

ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 0, 0, 0, 0, 4});
long l = bb.getLong();

System.out.println(l);

结果

4

我要感谢dfa在评论中指出了该方法。ByteBuffer.getLong


虽然它可能不适用于这种情况,但 s 的美妙之处在于查看具有多个值的数组。Buffer

例如,如果我们有一个 8 字节的数组,并且我们想将其视为两个值,我们可以将数组包装在一个 中,该数组被视为 IntBuffer,并通过 IntBuffer.get 获取值:intbyte[]ByteBuffer

ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 1, 0, 0, 0, 4});
IntBuffer ib = bb.asIntBuffer();
int i0 = ib.get(0);
int i1 = ib.get(1);

System.out.println(i0);
System.out.println(i1);

结果:

1
4

答案 2

假设第一个字节是最低有效字节:

long value = 0;
for (int i = 0; i < by.length; i++)
{
   value += ((long) by[i] & 0xffL) << (8 * i);
}

第一个字节是最重要的,那么它就有点不同了:

long value = 0;
for (int i = 0; i < by.length; i++)
{
   value = (value << 8) + (by[i] & 0xff);
}

将 long 替换为 BigInteger,如果字节数超过 8 个。

感谢Aaron Digulla纠正我的错误。