¿Cómo convertir una matriz de bytes a su valor numérico (Java)?

Tengo una matriz de 8 bytes y quiero convertirla a su valor numérico correspondiente.

p.ej

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

Quiero un método que realice la operación de conversión anterior.

Suponiendo que el primer byte es el byte menos significativo:

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

Es el primer byte el más significativo, entonces es un poco diferente:

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

Reemplace largo con BigInteger , si tiene más de 8 bytes.

Gracias a Aaron Digulla por la corrección de mis errores.

Uno podría usar los Buffer que se proporcionan como parte del paquete java.nio para realizar la conversión.

Aquí, la matriz de byte[] origen byte[] tiene una longitud de 8, que es el tamaño que corresponde con un valor long .

Primero, la matriz byte[] se envuelve en un ByteBuffer , y luego se llama al método ByteBuffer.getLong para obtener el valor long :

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

Resultado

 4 

Me gustaría agradecer a dfa por señalar el método ByteBuffer.getLong en los comentarios.


Aunque puede no ser aplicable en esta situación, la belleza de los Buffer s viene de mirar una matriz con múltiples valores.

Por ejemplo, si tuviéramos una matriz de 8 bytes y quisiéramos verla como dos valores int , podríamos envolver la matriz byte[] en un ByteBuffer , que se ve como IntBuffer y obtener los valores por 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); 

Resultado:

 1 4 

Si se trata de un valor numérico de 8 bytes, puede intentar:

 BigInteger n = new BigInteger(byteArray); 

Si se trata de un buffer de caracteres UTF-8, entonces puedes probar:

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

Simplemente, puede usar o consultar la guava lib proporcionada por google, que ofrece métodos de utilidad para la conversión entre long y byte array. Mi código de cliente:

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

También puede usar BigInteger para bytes de longitud variable. Puede convertirlo en Largo, Entero o Corto, según sus necesidades.

 new BigInteger(bytes).intValue(); 

o para denotar la polaridad:

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

Completa el código del convertidor de Java para todos los tipos primitivos desde y hacia matrices http://www.daniweb.com/code/snippet216874.html

Cada celda en la matriz se trata como unsigned int:

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