Pregunta

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

por ejemplo

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.

¿Fue útil?

Solución

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 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 por mucho tiempo con BigInteger , si tienes más de 8 bytes.

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

Otros consejos

Se podría usar el Buffer s que se proporcionan como parte de java.nio paquete para realizar la conversión.

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

Primero, la matriz byte [] está envuelta 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 del Buffer s viene al 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 ajustar la matriz byte [] en una < code> ByteBuffer , que se ve como un IntBuffer y obtenga los valores de 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 este es 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"));

Simplemente, puede usar o referirse a guava lib proporcionada por google, que ofrece métodos útiles 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 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();

Código completo del convertidor de Java para todos los tipos primitivos a / desde matrices http://www.daniweb.com/code/snippet216874.html

Cada celda de la matriz se trata como int sin signo:

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top