0

Javaソケットプログラムを使用して、サーバーからクライアントに整数と文字を書き戻しています。

    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

ワイヤーにint32と8Bのcharを書きたいです。私が書くときの整数について

    out.printf("%04x",1);

Wiresharkでは「30303031」と表示されますが、「01 000000」と表示したいのですが。同様にout.printf( "%d"、1); 「31」と表示されますが、「01 000000」と表示されます。4Bの整数と8Bの文字をワイヤーに書き込むにはどうすればよいですか?表現はエンコーディングと関係がありますか?

4

3 に答える 3

2

PrintWriteを使用してテキストをソケットに書き込むことは、エラーを隠すため、理想的ではありません。

あなたの場合、あなたはバイナリを書きたいように見えるので、試してみることをお勧めします。

DataOutputStream out = new DataOutputStream(
                       new BufferedOutputStream(clientSocket.getOutputStream()));

out.writeInt(1);

ただし、リトルエンディアン形式を訴えたい場合は、ブロッキングNIOを使用します。

SocketChannel sc = 
ByteBuffer bb= ByteBuffer.allocateDirect(1024).order(ByteOrder.LITTLE_ENDIAN);

bb.putInt(1);
// put whatever else
bb.flip();
while(bb.remaining() > 0) sc.write(bb);
于 2012-08-08T13:14:23.840 に答える
1

バイナリデータを書き込みたい場合は、PrintWriterやその他のライターをラッパーとして使用しないでください。代わりにDataOutputStreamを使用してみてください。これは、intなどを書き込むための一連のメソッドを提供します。

于 2012-08-08T13:13:23.490 に答える
1

はい。「%04x」と文字列変換を指定することにより、データの16進エンコードを暗黙的に選択します(つまり、数値をASCII文字列に変換します)。

ByteBuffer代わりに、整数を4バイトに変換するために使用します。詳細については、この回答を参照してください

于 2012-08-08T13:12:20.923 に答える