c ++ server htons a java ntohs cliente conversión
-
05-07-2019 - |
Pregunta
Estoy creando un pequeño cliente TFTP aplicación de servidor donde se desarrolla el servidor usando c ++ y el cliente usando java.
Aquí estoy enviando " recuento de bloques " valor
utilizando la conversión de htons
.
Pero no puedo volver a convertirlo a su valor original en el cliente.
Por ejemplo, si estoy enviando el recuento de bloques
ntohs (01)
(2 bytes) desde el servidor a
cliente. El cliente está leyendo en bytes.
El valor que estoy recibiendo es el byte 0
y byte 1.
Por favor, si alguien puede proporcionar un solución.
Solución
Supongo que quiso decir que usted usa ntohs
para descodificar los valores leídos de la red, y htons
para codificar los valores enviados a través de la red.
Busque < code> ByteBuffer # getShort () en concierto con ByteBuffer # order (ByteOrder)
. El orden de bytes de la red es big endian , así que use el valor ByteOrder # BIG_ENDIAN
para configurar su ByteBuffer
correctamente. Tenga en cuenta que BIG_ENDIAN
es el orden predeterminado, pero en este caso sería una buena forma de establecer su preferencia explícitamente.
No mencionaste lo que estás usando para las comunicaciones de red en Java. Si es un java.net.Socket
, puede llamar al Socket # getChannel ()
para obtener un java.nio.channels.SocketChannel
, un subtipo de java.nio.channels.ByteChannel
, con el que puede usar ByteBuffer
para leer y escribir datos.
Otros consejos
private void somemethod(){
byte[] fileDataFull = new byte[516];
byte[] receivedCounter = new byte[2];
readLength = in.read(fileDataFull);
receivedCounter[0] = fileDataFull[2];
receivedCounter[1] = fileDataFull[3];
if (expectedPktCount == convertntohs(receivedCounter)){
}
byte[] b = converthtons((short) expectedPktCount);
}
private short convertntohs(byte[] value) {
ByteBuffer buf = ByteBuffer.wrap(value);
return buf.getShort();
}
private byte[] converthtons(short sValue) {
byte[] baValue = new byte[2];
ByteBuffer buf = ByteBuffer.wrap(baValue);
return buf.putShort(sValue).array();
}
Los números de Java internamente siempre están en orden de bytes de red, incluso en sistemas donde los enteros / dobles nativos no lo están. Esto significa que puede convertir cualquier número que ingrese a Java con cualquiera de los flujos de entrada base que realizan este tipo de conversión, que implementan java.io.DataInput. ByteBuffer también funciona si está utilizando un canal java.nio.Channel pero allí puede cambiar la endianness ( ByteBuffer.order ()
), aunque el valor predeterminado es correcto para el orden de bytes de red y el almacenamiento interno de Java.
Por cierto, creo que te refieres a usar htons
pero en el ejemplo muestras ntohs
. Enviando desde C ++ desea convertir h ost para n pedido de red. Al recibir de Java (o cualquier otro cliente), su servidor se volvería a convertir utilizando ntohs
.