所以我通常使用Netty和它的BigEndianHeapChannelBuffer来接收Java中的unsinged short(来自c ++软件)。 当我这样做时:
buf.readUnsignedByte(); buf.readUnsignedByte();
它返回:
149 and 00
。直到现在一切都很好。因为服务器发送149为无符号短[2字节]。
而不是这个我希望收到unsigned short(重启我的应用程序后的ofc):
buf.readUnsignedShort();
并且魔术发生了。它返回:38144
。
下一步是检索无符号字节:
short type = buf.readUnsignedByte();
System.out.println(type);
并返回:1
这是正确的输出。
有人可以帮我吗? 我看得更深,这就是netty用它做的事情:
public short readShort() {
checkReadableBytes(2);
short v = getShort(readerIndex);
readerIndex += 2;
return v;
}
public int readUnsignedShort() {
return readShort() & 0xFFFF;
}
但我仍然无法弄清楚是什么问题。我想能够阅读那篇149.
答案 0 :(得分:1)
你也可以借用Java DataInputStream。readUnsignedShort()实现借用一个页面:
public final int readUnsignedShort() throws IOException {
int ch1 = in.read();
int ch2 = in.read();
if ((ch1 | ch2) < 0)
throw new EOFException();
return (ch1 << 8) + (ch2 << 0);
}
答案 1 :(得分:0)
答案是改变字节顺序。感谢Roger在评论中写道:
没什么魔法,149 * 256 + 0 = 38144。你已经指定了BigEndian,所以这似乎是正确的,首先发送最重要的字节
和
@mickula short是两个字节,其中一个字节“值”是另一个字节的256倍,因为你使用BigEndian,第一个字节就是“值”更多。类似于数字1,2和3的十进制数123.第一个位置是下一个位置的10倍,值是下一个位置的10倍,依此类推。因此,当一次传输一个数字时,1 * 100 + 2 * 10 + 3 = 123。如果你看1,2和3为小端,你会使用1 + 2 * 10 + 3 * 100 = 321. 256是因为一个字节的大小是256. -
感谢他的评论,我刚刚通过添加以下内容来切换服务器引导程序中的endianess:
bootstrap.setOption("child.bufferFactory", new
HeapChannelBufferFactory(ByteOrder.LITTLE_ENDIAN));