Frage

Ich erstelle eine kleine TFTP -Client -Server -App, in der Server mit C ++ und Client mit Java entwickelt wird.

Hier sende ich den Wert "Blockzahl" mithilfe des Werts htons Wandlung.

Aber ich kann es nicht in den ursprünglichen Wert beim Kunden umwandeln.

Zum Beispiel, wenn ich Blockzahl sende ntohs(01) (2 Bytes) vom Server zum Client. Der Kunde liest in Bytes. Wert, den ich erhält, ist Byte 0 und Byte 1.

Bitte, wenn jemand eine Lösung bereitstellen kann.

War es hilfreich?

Lösung

Ich nehme an, Sie meinten, Sie benutzen Sie ntohs zu dekodieren die Werte aus dem Netzwerk gelesen, und htons zu kodieren die über das Netzwerk gesendeten Werte.

Einblick in ByteBuffer#getShort() im Konzert mit ByteBuffer#order(ByteOrder). Netzwerk -Byte -Bestellung ist Big Endian, Verwenden Sie also den Wert ByteOrder#BIG_ENDIAN So konfigurieren Sie Ihre ByteBuffer richtig. Beachten Sie, dass BIG_ENDIAN ist die Standardreihenfolge, aber in diesem Fall wäre es eine gute Form, Ihre Präferenz explizit anzugeben.


Sie haben nicht erwähnt, was Sie für die Netzwerkkommunikation in Java verwenden. Wenn es ein ist java.net.Socket, Du kannst anrufen Socket#getChannel() a java.nio.channels.SocketChannel, ein Subtyp von java.nio.channels.ByteChannel, mit dem Sie verwenden können ByteBuffer Daten lesen und schreiben.

Andere Tipps

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

Javas Zahlen intern sind immer in Netzwerk -Byte -Reihenfolge, selbst auf Systemen, in denen die nativen Zahlen/Doppel nicht sind. Dies bedeutet, dass Sie eine beliebige Zahl konvertieren können, die mit einem der Basis -Eingangsströme, die diese Art von Konvertierung durchführen, in Java eingehen - die java.io.datainput implementieren. ByteBuffer funktioniert auch, wenn Sie ein java.nio.channel verwenden, aber dort können Sie die Endiantheit ändern (ByteBuffer.order()), obwohl der Standard für Netzwerk -Byte -Bestellung und interner Java -Speicher korrekt ist.

Übrigens, ich denke du willst es zu benutzen htons Aber in dem Beispiel, das Sie zeigen ntohs. Senden von C ++, die Sie konvertieren möchten host bestellen zu nETWERT. Empfangen von Java (oder einem Client), den Ihr Server mithilfe von Java umwandeln würde ntohs.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top