3

サーバーがc ++を使用して開発され、クライアントがJavaを使用して開発された小さなTFTPクライアントサーバーアプリを作成しています。

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

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

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

誰かが解決策を提供できる場合はお願いします。

4

3 に答える 3

3

ネットワークから読み取った値ntohsデコードし、ネットワーク経由で送信された値htonsエンコードするために使用することを意味していたと思います。

ByteBuffer#getShort()と合わせて調べByteBuffer#order(ByteOrder)ます。ネットワーク バイト オーダービッグ エンディアンであるため、この値を使用して適切ByteOrder#BIG_ENDIANに構成してください。ByteBufferこれがデフォルトの順序であることに注意してくださいBIG_ENDIAN。ただし、この場合は、好みを明示的に述べるのがよいでしょう。


Java でネットワーク通信に使用しているものについては言及していません。の場合java.net.Socket、 を呼び出してのサブタイプであるSocket#getChannel()を取得できます。これを使用して、データの読み取りと書き込みを行うことができます。java.nio.channels.SocketChanneljava.nio.channels.ByteChannelByteBuffer

于 2009-11-26T01:18:01.350 に答える
1
   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();
    }
于 2009-12-01T20:20:18.853 に答える
0

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

ちなみに、あなたが使用するつもりだと思いますhtonsが、あなたが示す例ではntohs. ホストオーダーをネットワークオーダーに変換したい C++ から送信します。Java (または任意のクライアント) から受信すると、サーバーは を使用して元に変換します。ntohs

于 2009-11-27T00:01:02.900 に答える