質問

小さなTFTPクライアントを作成しています  サーバーが開発されているサーバーアプリ  C ++とjavaを使用するクライアントを使用します。

ここでは、「ブロック数」を送信しています。値   htons 変換を使用します。

しかし、私はそれを元に戻すことができません  クライアントでの元の値に。

たとえば、ブロック数を送信している場合   ntohs(01)(2バイト)サーバーから  クライアント。クライアントはバイト単位で読み取っています。  私が受け取っている値はバイト0です  およびバイト1。

いずれかが提供できる場合  ソリューション。

役に立ちましたか?

解決

ntohs を使用してネットワークから読み取った値をデコードし、 htons encode ネットワーク経由で送信された値。

< code> ByteBuffer#getShort() ByteBuffer#order(ByteOrder) ネットワークのバイト順ビッグエンディアンなので、 ByteOrder#BIG_ENDIAN を使用して、 ByteBuffer を適切に設定します。 BIG_ENDIAN がデフォルトの順序であることに注意してください。ただし、この場合、好みを明示的に示すのが良いでしょう。


Javaのネットワーク通信に使用しているものについては言及しませんでした。 java.net.Socket の場合、 Socket#getChannel()を呼び出して java.nio.channels.SocketChannel を取得できます。 java.nio.channels.ByteChannel のサブタイプ。 ByteBuffer を使用してデータを読み書きできます。

他のヒント

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

Javaの内部的な番号は、ネイティブの整数/倍精度がそうでないシステムでも、常にネットワークバイト順です。これは、この種の変換(java.io.DataInputを実装する)を行うベース入力ストリームのいずれかを使用して、Javaに着信する任意の数を変換できることを意味します。 ByteBufferは、java.nio.Channelを使用している場合にも機能しますが、エンディアンを変更できます( ByteBuffer.order())。ただし、デフォルトはネットワークバイトの順序とJava内部ストレージに適しています。

ところで、 htons を使用するつもりですが、この例では ntohs を示しています。 C ++から送信して、 h ost順序を n etwork順序に変換します。 Java(または任意のクライアント)から受信すると、サーバーは ntohs を使用して逆変換します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top