Я пытаюсь использовать ByteBuffer для анализа потока пакетов данных, которые я получаю в виде массивов байтов, и может содержать частичные или несколько пакетов. Пакеты имеют переменную длину, поэтому мне нужно проанализировать первые два байта, чтобы получить длину пакета, и кажется, что как только я перевернул() буфер, чтобы прочитать пакет, я не могу вернуться и добавить больше данных, если пакет не завершен.java bytebuffer write read append
Как я могу записать данные в буфер, прочитать некоторые из них, чтобы проверить содержимое, а затем при необходимости добавить к нему дополнительные данные при сохранении прочитанных данных?
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();
}
}
не будет 'compact()' удалять любые данные, которые я уже читал, например, количество байтов, которое я просматриваю, чтобы посмотреть, есть ли у меня полный пакет или нет? – jmfox24