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.

¿Fue útil?

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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top