Conversione da htons del server c ++ a java ntohs client
-
05-07-2019 - |
Domanda
Sto creando un piccolo client TFTP app server su cui è sviluppato il server usando c ++ e client usando java.
Qui sto inviando " blocco conteggio " valore
utilizzando la conversione htons
.
Ma non sono in grado di riconvertirlo al suo valore originale al client.
Ad esempio se sto inviando il conteggio dei blocchi
ntohs (01)
(2 byte) dal server a
cliente. Il client sta leggendo in byte.
Il valore che sto ricevendo è byte 0
e byte 1.
Per favore, se qualcuno può fornire a soluzione.
Soluzione
Suppongo che intendessi usare ntohs
per decodificare i valori letti dalla rete e htons
per codificare i valori inviati tramite la rete.
Cerca < code> ByteBuffer # getShort () in concerto con ByteBuffer # order (ByteOrder)
. Ordine byte di rete è big endian , quindi utilizzare il valore ByteOrder # BIG_ENDIAN
per configurare correttamente il tuo ByteBuffer
. Tieni presente che BIG_ENDIAN
è l'ordine predefinito, ma in questo caso sarebbe una buona forma dichiarare esplicitamente le tue preferenze.
Non hai menzionato quello che stai usando per le comunicazioni di rete in Java. Se è un java.net.Socket
, puoi chiamare Socket # getChannel ()
per ottenere un java.nio.channels.SocketChannel
, un sottotipo di java.nio.channels.ByteChannel
, con il quale è possibile utilizzare ByteBuffer
per leggere e scrivere dati.
Altri suggerimenti
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();
}
I numeri di Java internamente sono sempre in ordine di byte di rete, anche su sistemi in cui non sono interi / doppi nativi. Ciò significa che è possibile convertire qualsiasi numero proveniente da Java con uno qualsiasi dei flussi di input di base che eseguono questo tipo di conversione, implementando java.io.DataInput. ByteBuffer funziona anche se si utilizza java.nio.Channel ma è possibile modificare l'endianness ( ByteBuffer.order ()
), sebbene l'impostazione predefinita sia corretta per l'ordinamento dei byte di rete e l'archiviazione interna Java.
A proposito, penso che intendi usare htons
ma nell'esempio mostri ntohs
. Inviando da C ++ si desidera convertire l'ordine h in ordine di rete n . Ricevendo da Java (o qualsiasi client) il tuo server verrebbe riconvertito usando ntohs
.