c ++サーバーhtonsからjava ntohsクライアントへの変換
-
05-07-2019 - |
質問
小さな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
を使用して逆変換します。