entero convertir convert bytes array java casting packing

convertir - convert byte to integer java



Java Convertir 4 bytes en int (5)

Me preguntaba si la solución para esto documentado aquí sigue siendo la solución o hay alguna otra forma de obtener un int de 4 bytes?

gracias.

EDITAR: estoy obteniendo el byte [] de los sockets .read

EDITAR: int recvMsgSize = in.read(Data, 0, BufferSize); si recvMsgSize es -1, sé que la conexión se ha eliminado.

¿Cómo puedo detectar esto cuando estoy usando DataInputStream en lugar de InputStream?

Gracias.

EDIT: disculpas por ser un yoyo con respecto a aceptar la respuesta correcta. pero después de la respuesta final actualizada de mihi, parece que el método es sólido y reduce la codificación extendida y, en mi opinión, la mejor práctica.


Como dijo mihi, depende de dónde obtengas esos bytes, pero este código podría ser útil:

int myNumber = (((int)byteOne) << 0) | (((int)byteTwo) << 8) | (((int)byteThree) << 16) | (((int)byteFour) << 24);


Debe tener mucho cuidado con cualquier conversión de ampliación y promoción numérica, pero el siguiente código convierte 4 byte en int :

byte b1 = -1; byte b2 = -2; byte b3 = -3; byte b4 = -4; int i = ((0xFF & b1) << 24) | ((0xFF & b2) << 16) | ((0xFF & b3) << 8) | (0xFF & b4); System.out.println(Integer.toHexString(i)); // prints "fffefdfc"

Ver también

  • Código Java Para convertir bytes a Hexadecimal
    • Preste atención a la necesidad de enmascarar con & 0xFF ; probablemente termine haciendo mucho de esto si está trabajando con byte ya que todas las operaciones aritméticas se promocionan a int (o long )

Dependiendo de dónde obtienes esos 4 bytes de:

http://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html#readInt ()

http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html#getInt(int)

Por supuesto, puede hacerlo manualmente, pero en la mayoría de los casos, usar uno de ellos (si tiene que convertir una matriz de bytes con muchos bytes, es posible que desee utilizar un DataInputStream alrededor de un ByteArrayInputStream por ejemplo) es más fácil.

Editar : si necesita cambiar el endianness, tendrá que usar un ByteBuffer, o invertir los bytes usted mismo, o hacer la conversión usted mismo, ya que DataInput no es compatible con el cambio de endianness.

Edit2 : cuando los obtiene del flujo de entrada de socket, lo envuelvo en un DataInputStream y lo uso para leer todo tipo de datos. Especialmente dado que InputStream.read (byte []) no garantizará llenar toda la matriz de bytes ... DataInputStream.readFully sí.

DataInputStream in = new DataInputStream(socket.getInputStream()); byte aByte = in.readByte(); int anInt = in.readInt(); int anotherInt = in.readInt(); short andAShort = in.readShort(); // 11 bytes read :-) byte[] lotOfBytes = new byte[anInt]; in.readFully(lotOfBytes);

Edit3 : cuando se leen varias veces desde una secuencia, continuarán leyendo donde se detuvo, es decir, aByte será byte 0, anInt serán bytes 1 a 4, anotherInt serán bytes 5 a 8, etc. readFully continuará leyendo después de todo eso y bloqueará hasta que haya leído lotOfbytes .

Cuando la transmisión se detiene (la conexión cae) obtendrá EOFException lugar de -1, por lo que si obtiene -1, el int realmente fue -1.

Si no desea analizar ningún byte, puede omitirlos (). No es posible analizar un byte de 2 formas diferentes con DataInputStream (es decir, lee primero un int del byte 0 a 3, luego uno desde el byte 2 a 5), ​​pero generalmente tampoco es necesario.

Ejemplo:

// read messages (length + data) until the stream ends: while (true) { int messageLength; try { messageLength = in.readInt(); // bytes 0 to 3 } catch (EOFException ex) { // connection dropped, so handle it, for example return; } byte[] message = new byte[messageLength]; in.readFully(message); // do something with the message. } // all messages handled.

Espero que esto responda a sus preguntas adicionales.


Si ya los tiene en una matriz de byte[] , puede usar:

int result = ByteBuffer.wrap(bytes).getInt();

o, si tiene guava-libraries de Google en su classpath, tiene el atajo:

int result = Ints.fromByteArray(array);

que tiene la ventaja de que tiene API igualmente agradables para otros tipos ( Longs.fromByteArray , Shorts.fromByteArray , etc.).


Una solución en estilo funcional (solo por variedad, no muy conveniente en uso):

private int addByte (int base, byte appendix) { return (base << 4) + appendix; } public void test() { byte b1 = 5, b2 = 5, byte b3 = 0, b4 = 1; int result = addByte (addByte (addByte (addByte (0, b1), b2), b3), b4); }