0

我有一个短计数器,它递增并用作标识符。我需要将标识符作为网络套接字上的二进制数据发送。

因此,如果我有一个短值,我可以这样做以“打包”两个字节:

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 回答