Pergunta

Estou criando um pequeno aplicativo de servidor de cliente TFTP, onde o servidor é desenvolvido usando C ++ e cliente usando Java.

Aqui estou enviando valor "contagem de blocos" usando htons conversão.

Mas não consigo convertê -lo de volta ao seu valor original no cliente.

Por exemplo, se estou enviando contagem de blocos ntohs(01) (2 bytes) do servidor para o cliente. O cliente está lendo em bytes. O valor que estou recebendo é o byte 0 e o byte 1.

Por favor, se alguém puder fornecer uma solução.

Foi útil?

Solução

Eu acho que você quis dizer que você usa ntohs para decodificar os valores lidos na rede e htons para codificar os valores enviados pela rede.

Investigar ByteBuffer#getShort() em concerto com ByteBuffer#order(ByteOrder). Pedido de byte de rede é Big Endian, então use o valor ByteOrder#BIG_ENDIAN Para configurar o seu ByteBuffer devidamente. Observe que BIG_ENDIAN é a ordem padrão, mas, neste caso, seria uma boa forma para declarar sua preferência explicitamente.


Você não mencionou o que está usando para comunicações de rede em Java. Se for um java.net.Socket, você pode ligar Socket#getChannel() para obter um java.nio.channels.SocketChannel, um subtipo de java.nio.channels.ByteChannel, com o qual você pode usar ByteBuffer para ler e escrever dados.

Outras dicas

   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();
    }

Os números de Java internamente estão sempre em ordem de bytes de rede, mesmo em sistemas em que os números inteiros/duplos nativos não são. Isso significa que você pode converter qualquer número que chegue a Java com qualquer um dos fluxos de entrada base que fazem esse tipo de conversão - que implementam java.io.datainput. ByteBuffer também funciona se você estiver usando um java.nio.Channel, mas aí você pode mudar o endianness (ByteBuffer.order()), embora o padrão esteja correto para pedidos de bytes de rede e armazenamento interno Java.

A propósito, acho que você quer usar htons Mas no exemplo que você mostra ntohs. Enviando de C ++ que você deseja converter hORMANDO OST para nETWork Ordem. Recebendo de Java (ou de qualquer cliente), seu servidor se converteria usando ntohs.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top