我有一个短计数器,它会递增并用作标识符。我需要在网络套接字上将标识符作为二进制数据发送。
因此,如果我有一个短值,我可以这样做以将其“打包”为两个字节:
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发送,那么在另一端它可以根据需要解释它?
最佳答案
是的,你的想法是对的。
仅供您引用:有一个非常好的类(class)可以为您完成此操作。它被称为DataInputStream
和 DataOutputStream
.
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();
关于Java 按位右移 255 为字节值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12662988/