3

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

4

2 回答 2

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);
}
于 2012-07-02T14:37:14.960 回答
0

答案是改变字节顺序。感谢 Roger 在评论中写道:

没有多少魔法,149*256+0=38144。您已指定 BigEndian,因此这似乎是正确的,首先发送最高有效字节

和:

@mickula 短是两个字节,其中一个字节的“价值”是另一个字节的 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。-

感谢他的评论,我刚刚通过添加以下内容在服务器引导程序中切换了字节​​序:
bootstrap.setOption("child.bufferFactory", new HeapChannelBufferFactory(ByteOrder.LITTLE_ENDIAN));

于 2012-06-24T15:40:03.390 回答