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

pir*_*ate 86 java algorithm numbers bytearray

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

例如

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

// CONVERSION OPERATION
// return the numeric value
Run Code Online (Sandbox Code Playgroud)

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

coo*_*ird 112

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

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

首先,将byte[]数组包装在一个ByteBuffer,然后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);
Run Code Online (Sandbox Code Playgroud)

结果

4
Run Code Online (Sandbox Code Playgroud)

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


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

例如,如果我们有一个8字节的数组,并且我们想将它视为两个int值,我们可以将byte[]数组包装成一个ByteBuffer,它被视为a IntBuffer并通过IntBuffer.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);
Run Code Online (Sandbox Code Playgroud)

结果:

1
4
Run Code Online (Sandbox Code Playgroud)


Mne*_*nth 102

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

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

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

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

如果您有超过8个字节,请使用BigInteger替换long .

感谢Aaron Digulla纠正我的错误.

  • -1个字节是有符号值!并用shift(<<)替换pow()!"value =(value << 8)+(by [i]&0xff)" (8认同)
  • 如果其他人遇到了同样的问题,在第一个例子中,[i]必须强制转换为long,否则它只适用于小于2 ^ 32的值.也就是说,`value + =((long)by [i]&0xffL)<<(8*i);` (5认同)

Vin*_*ert 16

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

BigInteger n = new BigInteger(byteArray);
Run Code Online (Sandbox Code Playgroud)

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

BigInteger n = new BigInteger(new String(byteArray, "UTF-8"));
Run Code Online (Sandbox Code Playgroud)


Che*_* Yi 14

简单地说,您可以使用或引用google提供的guava lib,它提供了在long和byte数组之间进行转换的实用方法.我的客户代码:

    long content = 212000607777l;
    byte[] numberByte = Longs.toByteArray(content);
    logger.info(Longs.fromByteArray(numberByte));
Run Code Online (Sandbox Code Playgroud)


Jam*_*oms 8

您还可以将BigInteger用于可变长度字节.您可以将其转换为Long,Integer或Short,以满足您的需求.

new BigInteger(bytes).intValue();
Run Code Online (Sandbox Code Playgroud)

或表示极性:

new BigInteger(1, bytes).intValue();
Run Code Online (Sandbox Code Playgroud)