Я передаю плоские буферы по сети, поэтому каждый буфер имеет префикс размера, равный 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 байт каждое.Это ошибка бафферов?