0

インクリメントして識別子として使用される短いカウンターがあります。ネットワークソケットで識別子をバイナリデータとして送信する必要があります。

したがって、値が短い場合は、これを実行して2バイトで「パック」することができます。

short id = 1;
byte val = (byte)(id & 0xFF);
byte val2 = (byte)((id >>> 8) & 0xFF);
System.out.printf("id=%d, val = id & 0xFF = %d, val2 = (id >>> 8) & 0xFF = %d\n", 
                   id, val, val2);

id = 1の場合、これは正常に機能します。

しかし、id = 255の場合、次のようになります。

short id = 255;
byte val = (byte)(id & 0xFF);           //val = -1
byte val2 = (byte)((id >>> 8) & 0xFF);  //val2 = 0

これで、バイナリの255は11111111であり、これはJavaバイト値の場合は-1を意味することがわかりました。Javaがそれをどのように解釈するかは重要ではなく、バイトバイナリ11111111として送信すると、もう一方の端でこれを好きなように解釈できると考えるのは正しいですか?

4

2 に答える 2

1

はい、あなたの考えは正しいです。

参考までに、これを行う非常に優れたクラスがあります。と呼ばDataInputStreamDataOutputStreamます。

Socket socket = ...;
DataInputStream dis = new DataInputStream(socket.getInputStream());
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

/* Write a short */
short out = 255;
dos.writeShort(out);

/* Read a short */
short in = dis.readShort();
于 2012-09-30T16:44:10.460 に答える
0

Java では、すべてのデータ型が署名済みとして解釈されます。つまり、最上位ビットが 1 に等しい数値は負の数値です。ネットワーク経由で番号を送信する場合、同じビットを送信するため、Java によってどのように解釈されるかは問題ではありません。はい、あなたのコードは意図したとおりに動作します。

于 2012-09-30T16:59:17.680 に答える