Pregunta

Me preguntaba si la solución para este documentado aquí es siendo la solución o hay alguna otra manera de conseguir un entero de 4 bytes?

gracias.

EDIT: Im consiguiendo el byte [] de tomas .read

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

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

gracias.

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

¿Fue útil?

Solución

Dependiendo de donde se obtiene los 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 todavía hacerlo de forma manual, pero en la mayoría de los casos utilizando uno de los (si usted tiene que convertir una matriz de bytes con una gran cantidad de bytes, es posible que desee utilizar un DataInputStream alrededor de un ByteArrayInputStream por ejemplo) es más fácil.

Editar . Si necesita cambiar el orden de bits, tendrá que utilizar un ByteBuffer, o invertir el mismo bytes, o hacer la conversión a sí mismo, como DataInput no permite cambiar el orden de bits

Edit2 : cuando los obtenga de la toma de corriente de entrada, me envuelvo que uno en un DataInputStream y lo uso para leer todo tipo de datos. Sobre todo porque InputStream.read (byte []) no garantizará para llenar toda la matriz de bytes ... DataInputStream.readFully hace.

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 : Al leer varias veces de una corriente, van a seguir leyendo en el que detuvo, i. mi. aByte será byte 0, anInt será bytes 1 a 4, anotherInt será bytes 5 a 8, etc. readFully leerá en después de todo eso y se bloqueará hasta que tiene lotOfbytes lectura.

Cuando la corriente se detiene (interrumpe la conexión) obtendrá EOFException en lugar de -1, por lo que si se obtiene -1, el int realmente era -1.

Si no desea analizar los bytes en absoluto, puede omitir () ellos. Analizar un byte de 2 maneras diferentes no es posible con DataInputStream (i. E. Leer primero un int de byte 0 a 3, entonces uno de byte 2 a 5), ??pero generalmente no necesita tampoco.

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 responde a sus preguntas adicionales.

Otros consejos

Hay que tener mucho cuidado con cualquier conversión de ampliación y promoción numérica, pero el código de abajo conversos 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 byte Para convertir a hexadecimal
    • Prestar atención a la necesidad de enmascarar con & 0xFF - que probablemente va a terminar haciendo un montón de esto si se trabaja con byte ya que todas las operaciones aritméticas promueven a int (o long)

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

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

o, si tiene de Google guayaba-bibliotecas en su ruta de clases, usted tiene el acceso directo:

int result = Ints.fromByteArray(array);

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

Una solución en estilo funcional (sólo para la variedad, en mi humilde opinión 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);
}

Como mihi dicho, depende de dónde se está recibiendo esos bytes de, pero este código podría ser de utilidad:

int myNumber = (((int)byteOne) << 0) |
    (((int)byteTwo) << 8) |
    (((int)byteThree) << 16) |
    (((int)byteFour) << 24);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top