【发布时间】:2019-04-11 06:42:11
【问题描述】:
我通过网络流式传输平面缓冲区,因此每个缓冲区都有大小前缀,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 字节的消息。这是 flatbuffers 的错误吗?
【问题讨论】:
标签: c++ serialization flatbuffers