Это префикс размера для каждого буфера или всей программы? - PullRequest
0 голосов
/ 11 апреля 2019

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

1 Ответ

0 голосов
/ 11 апреля 2019

Пожалуйста, убедитесь, что вы разрабатываете с включенными утверждениями, так как это уже говорило бы вам, что приведенный выше код неверен.

Когда вы вызываете Finish в компоновщике, вы не можете сериализовать в него больше данныхЕсли только вы не позвоните Clear.Таким образом, в этом случае второй буфер также содержит копию первого буфера.Assert сказал бы вам это.

Конечно, вы также можете использовать 2 FlatBufferBuilder экземпляров, если вы хотите легко сохранить оба буфера доступными.

...