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
Buffer
mensajes de correo electrónico que se proporcionan como parte deljava.nio
paquete 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 unlong
valor.Primero, la
byte[]
matriz se envuelve en aByteBuffer
, y luegoByteBuffer.getLong
se llama al método para obtener ellong
valor: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
ByteBuffer.getLong
método en los comentarios.Aunque puede que no sea aplicable en esta situación, la belleza de
Buffer
s 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
int
valores, podríamos envolver labyte[]
matriz en anByteBuffer
, que se ve como aIntBuffer
y 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 4
fuente
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