Я передаю плоские буферы по сети, поэтому каждый буфер имеет префикс размера FinishSizePrefixedFoo(fbb, msg)
, но я заметил, что этот префикс размера не является размером структуры сообщения msg
, это размер всего построителя буфера. Например:
flatbuffers::FlatBufferBuilder fbb;
flatbuffers::Offset<Message> msg;
msg = sge::sgedm::CreateMessage(fbb, ...);
FinishSizePrefixedMessageBuffer(fbb, msg);
flatbuffers::uoffset_t len = flatbuffers::ReadScalar<flatbuffers::uoffset_t>(fbb.GetBufferPointer());
std::cout << "Buffer size is " << fbb.GetSize() << " size prefix is " << len << std::endl;
flatbuffers::Offset<Message> msg2;
msg2 = sge::sgedm::CreateMessage(fbb, ...);
FinishSizePrefixedMessageBuffer(fbb, msg2);
len = flatbuffers::ReadScalar<flatbuffers::uoffset_t>(fbb.GetBufferPointer());
std::cout << "Buffer size is " << fbb.GetSize() << " size prefix is " << len << std::endl;
Результат:
Buffer size is 84 size prefix is 80
Buffer size is 168 size prefix is 164
Но ожидаемый результат:
Buffer size is 84 size prefix is 80
Buffer size is 168 size prefix is 80
В противном случае нет возможности разделить два сообщения.
Я использую этот префикс размера для проверки и десериализации, например:
buf[4] = recv(4);
uoffset_t len = ReadScalar(buf);
buf[4..len+4] = recv(len);
msg = GetSizePrefixedMessage(buf);
Когда я читаю, что размер равен 164, ожидается, что последует сообщение размером 164, хотя на самом деле это два сообщения по 80 байт каждое. Это ошибка плоских буферов?