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.

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top