如何在java中存储unsigned short?

时间:2012-06-24 15:16:42

标签: java nio netty unsigned

所以我通常使用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.

2 个答案:

答案 0 :(得分:1)

你也可以借用Java DataInputStreamreadUnsignedShort()实现借用一个页面:

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));