Java 字节缓冲区写入读取追加



我正在尝试使用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();
    }
}

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

最新更新