3

したがって、一般的に私はNettyを使用しており、Javaで(c ++ソフトウェアから)歌われていないshortを受信するのはBigEndianHeapChannelBufferです。私がこのようにそれをするとき:

buf.readUnsignedByte(); buf.readUnsignedByte();

戻ります: 149 and 00。今まですべてが順調です。サーバーが149をunsignedshort[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

JavaDataInputStreamからページを借用することもできます。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

答えは、エンディアンを変更することです。コメントで書いたロジャーに感謝します:

あまり魔法ではない、149 * 256 + 0=38144。BigEndianを指定したので、これは正しいようです。最上位バイトが最初に送信されます

と:

@mickulaショートは2バイトで、一方のバイトはもう一方の256倍の「価値」があります。BigEndianを使用しているため、最初のバイトの方が「価値」があります。1、2、および3の数字の10進数123と同様です。最初の位置は、次の位置の10倍であり、次の位置の10倍に相当します。したがって、数字が一度に1つずつ転送される場合、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 に答える