96

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

例如

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

// CONVERSION OPERATION
// return the numeric value

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

4

9 回答 9

121

可以使用Buffer作为包的一部分提供的 sjava.nio来执行转换。

这里,源byte[]数组的 a 长度为 8,这是与long值对应的大小。

首先将byte[]数组包裹在 aByteBuffer中,然后ByteBuffer.getLong调用方法获取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方法。


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

例如,如果我们有一个 8 字节数组,并且我们想将其视为两个值,我们可以将数组int包装在 an中,将其视为 a并通过以下方式获取值:byte[]ByteBufferIntBufferIntBuffer.get

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
于 2009-06-22T12:01:03.200 回答
113

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

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);
}

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

感谢 Aaron Digulla 纠正我的错误。

于 2009-06-22T12:01:33.260 回答
17

如果这是一个 8 字节的数值,您可以尝试:

BigInteger n = new BigInteger(byteArray);

如果这是一个 UTF-8 字符缓冲区,那么您可以尝试:

BigInteger n = new BigInteger(new String(byteArray, "UTF-8"));
于 2009-06-22T12:03:34.987 回答
17

简单地说,你可以使用或参考google提供的guava lib,它提供了长数组和字节数组之间转换的实用方法。我的客户代码:

    long content = 212000607777l;
    byte[] numberByte = Longs.toByteArray(content);
    logger.info(Longs.fromByteArray(numberByte));
于 2012-04-26T11:03:04.287 回答
9

您还可以将 BigInteger 用于可变长度字节。您可以根据需要将其转换为 Long、Integer 或 Short。

new BigInteger(bytes).intValue();

或表示极性:

new BigInteger(1, bytes).intValue();
于 2013-07-31T21:11:47.290 回答
3

所有原始类型与数组之间的完整 Java 转换器代码 http://www.daniweb.com/code/snippet216874.html

于 2011-02-23T10:56:55.443 回答
1

数组中的每个单元都被视为无符号整数:

private int unsignedIntFromByteArray(byte[] bytes) {
int res = 0;
if (bytes == null)
    return res;


for (int i=0;i<bytes.length;i++){
    res = res | ((bytes[i] & 0xff) << i*8);
}
return res;
}
于 2014-07-13T08:08:28.157 回答
0
public static long byteArrayToLong(byte[] bytes) {
    return ((long) (bytes[0]) << 56)
            + (((long) bytes[1] & 0xFF) << 48)
            + ((long) (bytes[2] & 0xFF) << 40)
            + ((long) (bytes[3] & 0xFF) << 32)
            + ((long) (bytes[4] & 0xFF) << 24)
            + ((bytes[5] & 0xFF) << 16)
            + ((bytes[6] & 0xFF) << 8)
            + (bytes[7] & 0xFF);
}

将字节数组(长为 8 个字节)转换为长

于 2020-12-14T15:10:22.373 回答
0

您可以尝试使用此答案中的代码:https ://stackoverflow.com/a/68393576/7918717

它将字节解析为任意长度的有符号数。几个例子:

bytesToSignedNumber(false, 0xF1, 0x01, 0x04)返回15794436(3 个字节为int

bytesToSignedNumber(false, 0xF1, 0x01, 0x01, 0x04)返回-251592444(4 个字节为int

bytesToSignedNumber(false, 0xF1, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x04)返回-1080581331768770303(9 个字节中的 8

于 2021-07-16T13:01:18.277 回答