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.

new BigInteger(by).longValue()Respuestas:
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); }Si el primer byte es el más significativo, luego es un poco diferente:
long value = 0; for (int i = 0; i < by.length; i++) { value = (value << 8) + (by[i] & 0xff); }Reemplace long con BigInteger , si tiene más de 8 bytes.
Gracias a Aaron Digulla por la corrección de mis errores.
fuente
value += ((long)by[i] & 0xffL) << (8 * i);Se pueden utilizar los
Buffermensajes de correo electrónico que se proporcionan como parte deljava.niopaquete para realizar la conversión.Aquí, la
byte[]matriz de origen tiene una longitud de 8, que es el tamaño que se corresponde con unlongvalor.Primero, la
byte[]matriz se envuelve en aByteBuffer, y luegoByteBuffer.getLongse llama al método para obtener ellongvalor:ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 0, 0, 0, 0, 4}); long l = bb.getLong(); System.out.println(l);Resultado
4Me gustaría agradecer a dfa por señalar el
ByteBuffer.getLongmétodo en los comentarios.Aunque puede que no sea aplicable en esta situación, la belleza de
Buffers viene con mirar una matriz con múltiples valores.Por ejemplo, si tuviéramos una matriz de 8 bytes y quisiéramos verla como dos
intvalores, podríamos envolver labyte[]matriz en anByteBuffer, que se ve como aIntBuffery obtener los valores medianteIntBuffer.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 4fuente
Si se trata de un valor numérico de 8 bytes, puede intentar:
BigInteger n = new BigInteger(byteArray);Si se trata de un búfer de caracteres UTF-8, puede intentar:
BigInteger n = new BigInteger(new String(byteArray, "UTF-8"));fuente
Simplemente, puede usar o consultar guava lib proporcionada por Google, que ofrece métodos útiles para la conversión entre matriz larga y de bytes. Mi código de cliente:
long content = 212000607777l; byte[] numberByte = Longs.toByteArray(content); logger.info(Longs.fromByteArray(numberByte));fuente
También puede utilizar BigInteger para bytes de longitud variable. Puede convertirlo a largo, entero o corto, lo que se adapte a sus necesidades.
new BigInteger(bytes).intValue();o para denotar polaridad:
new BigInteger(1, bytes).intValue();fuente
Código de conversión de Java completo para todos los tipos primitivos hacia / desde matrices http://www.daniweb.com/code/snippet216874.html
fuente
Cada celda de 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<bytes.length;i++){ res = res | ((bytes[i] & 0xff) << i*8); } return res; }fuente