C ++ servidor htons para Java NTOHS Conversão do cliente
-
05-07-2019 - |
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.
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
.