0

すでに利用可能な既存の TCP サーバーに対して、Java で tcp リクエストを作成しようとしています。インターフェイスの仕様は次のとおりです。

Field           Length      Type
Length          2 bytes     16-bits binary
Message ID      1 byte      8-bits binary
MSGTYPE         1 byte      8-bits binary
Variable1       4 bytes     32-bits binary
Variable2       30 bytes    ASCII
Variable3       1 byte      8-bits binary

BigInteger を使用して String を Binary に変換する方法を理解しています。

String testing = "Test Binary";
byte[] bytes = testing.getBytes();
BigInteger bi = new BigInteger(bytes);
System.out.println(bi.toString(2));

私の理解では、TCPリクエストを作成したい場合は、最初に

  1. 各バイナリを文字列に変換する必要があります
  2. 値を StringBuffer に追加します。

残念ながら、私の理解は限られているため、TCP リクエストを正しく作成するためのアドバイスが必要でした。

4

2 に答える 2

3

String (バイナリデータがあるため)、StringBuffer (これまで)、または BigInteger (設計されたものではないため) は使用しません。

ビッグ エンディアン データ ストリームがあると仮定すると、DataOutputStream を使用します。

DataOutptuStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));

out.writeShort(length);
out.write(messageId);
out.write(msgtype);
out.write((var1+"\0\0\0\0").substring(0, 4).getBytes("ISO-8859-1"));
out.write(var2.getBytes("ISO-8859-1"));
out.write(var2);

out.flush(); // optionally.

リトルエンディアン プロトコルを使用している場合は、ByteBuffer を使用する必要があります。この場合、ブロッキング NIO SocketChannel を使用します。

ところで、 (7ISO-8859-1ビットバイト)ではなく(8ビットバイト)を使用しますUS-ASCII

于 2012-10-03T12:27:47.090 に答える
0

あなたは間違った方向に進んでいます。たとえば、最初のフィールドが 16 ビット バイナリであるとメッセージ仕様に記載されているという事実は、バイナリ文字列を送信するという意味ではありません。(符号なし?) 16 ビットの数値を送信するだけです。これは、内部表現が 2 進法である可能性があるため、実際には 2 進法でコード化されます。

DataOutputStreamlike を介してソケットに書き込む場合

int value = 123456;
out.writeInt(value);

あなたはすでにバイナリで書いています。

于 2012-10-03T12:28:30.190 に答える