我有一个简短的计数器,它递增并用作标识符。我需要在网络套接字上将标识符作为二进制数据发送。
因此,如果我有一个短值,我可以用两个字节来“打包”:
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然后在另一端,它可以解释它,但它想要吗?
答案 0 :(得分:1)
是的,你的想法是正确的。
仅供参考:有一个很好的课程可以帮到你。它被称为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();
答案 1 :(得分:0)
在Java中,所有数据类型都被解释为已签名。也就是说,最高有效位等于1的任何数字都是负数。当您通过网络发送号码时,由Java解释它的方式并不重要,因为您仍然发送相同的位。是的,您的代码将按预期工作。