【问题标题】:java bytebuffer write read appendjava bytebuffer 写 读 追加
【发布时间】:2016-08-13 20:47:12
【问题描述】:

我正在尝试使用 ByteBuffer 来解析我作为字节数组接收的数据包流,并且可能包含部分或多个数据包。数据包的长度可变,因此我需要解析前两个字节以获取数据包长度,并且似乎一旦我翻转()缓冲区来读取数据包,如果数据包不完整,我就无法返回并附加更多数据。

如何将数据写入缓冲区,读取其中的一部分以验证内容,然后在必要时向其追加更多数据,同时保留读取的数据?

class Foo {

    static final byte[] DATA1 = {0, 13, 2, 65, 88, 80, 55, 51, 52, 84, 82, 43, -111};
    static final byte[] DATA2 = {0, 21, 6, 2, 3, 67, 23, 71, -77, 24, -66, -12, -76, 98, 25, 61, 54, -20, 127, -118, 71};
    static final byte[] DATA3 = {0, 21, 5, 3, 5, 67};
    static final byte[] DATA4 = {23, 72, -50, 24, -66, -9, -31, -86, 25, 61, -95, 75, 71, 47, -102, 0, 13, 2, 84};
    static final byte[] DATA5 = {82, 65, 28, 10, 65, 71, 52, 44, 11};

    ByteBuffer mByteBuffer = ByteBuffer.allocate(4096);

    public void test() {
        mByteBuffer.order(ByteOrder.BIG_ENDIAN);
        parse(DATA1);
        parse(DATA2);
        parse(DATA3);
        parse(DATA4);
        parse(DATA5);
    }

    public void parse(byte[] bytes) {
        short byteCount;
        short crc;

        mByteBuffer.put(bytes);
        mByteBuffer.flip();

        while (mByteBuffer.remaining() > 5) {
            byteCount = mByteBuffer.getShort();

            // check for invalid buffer
            if (byteCount < 5) {
                mByteBuffer.clear();
                return;
            }

            if (mByteBuffer.remaining() < (byteCount - 2)) {
                // TODO: incomplete packet, do something
            }

            // payload (u8[1 .. 4092])
            byte[] payload = new byte[byteCount - 4];
            mByteBuffer.get(payload, 0, payload.length);

            // crc (u16)
            crc = mByteBuffer.getShort();
        }

        mByteBuffer.clear();
    }
}

【问题讨论】:

    标签: java bytebuffer


    【解决方案1】:

    在getShort() 之后调用compact(),或者通常在任何获取或写入序列之后和下一个read() 之前调用。

    【讨论】:

    • 不会compact() 删除我已经读取的任何数据,例如我正在查看的字节数以查看我是否有完整的数据包?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 2015-03-16
    • 1970-01-01
    相关资源
    最近更新 更多