2010-12-20 43 views
15

Necesito convertir una matriz de 2 bytes (byte [2]) a un valor entero en java. ¿Cómo puedo hacer eso?Java: Convertir bytes a entero

+5

Esta pregunta podría usar alguna aclaración. Tal como está ahora, solo veremos qué quiere decir con qué respuesta selecciona. –

Respuesta

24

Se puede utilizar para este ByteBuffer:

ByteBuffer buffer = ByteBuffer.wrap(myArray); 
buffer.order(ByteOrder.LITTLE_ENDIAN); // if you want little-endian 
int result = buffer.getShort(); 

Ver también Convert 4 bytes to int.

+5

+1 para la solución ByteBuffer – Casey

+0

Gracias, funcionó. Will ByteBuffer se ocupa de los bytes firmados y no firmados? – keshav

+0

@keshav: ¿qué quieres decir? No existe el byte "firmado" o "sin firmar". Un byte es solo un grupo de '0's y' 1' s; el ** ** significado es en la forma de interpretar esos números. –

3

Bueno, cada byte es un número entero en el rango -128..127, por lo que necesita una forma de asignar un par de enteros a un solo entero. Hay muchas maneras de hacerlo, dependiendo de lo que haya codificado en el par de bytes. El más común será almacenar un entero de 16 bits con signo como un par de bytes. Convertir ese nuevo a un número entero depende de si usted lo almacena forma bigEndian:

(byte_array[0]<<8) + (byte_array[1] & 0xff) 

o Little Endian:

(byte_array[1]<<8) + (byte_array[0] & 0xff) 
10

En Java, Bytes están firmados, lo que significa que el valor de un byte puede ser negativo y cuando eso suceda, la solución original de @ MattBall no funcionará.

Por ejemplo, si la forma binaria de la matriz de bytes son como este:

entonces myArray [0] es 1000 1101 y myArray [1] es 1000 1101, el valor decimal de byte 1000 1101 es -115 en lugar de 141 (= 2^7 + 2^3 + 2^2 + 2^0)

si utilizamos

int result = (myArray[0] << 8) + myArray[1]

el valor sería -16191 que está EQUIVOCADO.

La razón por la que su mal es que cuando interpretamos una matriz de 2 bytes en número entero, todos los bytes son sin firmar, por lo que cuando se traduce, se deben mapear los bytes firmados a entero sin signo:

((myArray[0] & 0xff) << 8) + (myArray[1] & 0xff)

el resultado es 36237, use una calculadora o ByteBuffer para verificar si es correcta (lo he hecho, y sí, es correcto).

+0

muchas gracias por la explicación :) – shadygoneinsane

3

Además, si se puede usar la biblioteca de guayaba:

Ints.fromByteArray(0, 0, myArray[1], myArray[0]); 

Era digno de mención, ya que muchos de los proyectos de uso de todos modos.

3

Basta con hacer esto:

return new BigInteger(byte[] yourByteArray).intValue(); 

funciona muy bien en las conversiones de mando Bluetooth, etc. No hay necesidad de preocuparse firmado frente a la conversión sin firmar.