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

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

例如

byte[] by = new byte[8]; // the byte array is stored in 'by' // CONVERSION OPERATION // return the numeric value 

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

假设第一个字节是最不重要的字节:

 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个字节,则用BigIntegerreplacelong。

感谢Aaron Digulla纠正我的错误。

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

这里,源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); 

结果

 4 

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


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

例如,如果我们有一个8字节的数组,并且想把它看作两个int值,我们可以将byte[]数组包装在一个ByteBuffer ,这个ByteBuffer被看作是一个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); 

结果:

 1 4 

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

 BigInteger n = new BigInteger(byteArray); 

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

 BigInteger n = new BigInteger(new String(byteArray, "UTF-8")); 

简单地说,你可以使用或引用谷歌提供的guava lib,它提供了在long和byte数组之间转换的utiliy方法。 我的客户代码:

  long content = 212000607777l; byte[] numberByte = Longs.toByteArray(content); logger.info(Longs.fromByteArray(numberByte)); 

您也可以使用BigInteger获取可变长度的字节。 您可以将其转换为Long,Integer或Short,以适合您的需求。

 new BigInteger(bytes).intValue(); 

或表示极性:

 new BigInteger(1, bytes).intValue(); 

完整的Java转换器代码,用于所有基元types到/从数组http://www.daniweb.com/code/snippet216874.html

数组中的每个单元都被视为unsigned int:

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