我正在通过网络流式传输平面缓冲区,因此每个缓冲区的大小都以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的错误吗?
答案 0 :(得分:0)
请确保您使用asserts进行开发,因为这已经告诉您上述代码不正确。
在构建器上调用Finish
时,除非调用Clear
,否则无法在其中序列化更多数据。因此,在这种情况下,第二个缓冲区也包含第一个缓冲区的副本。肯定会告诉你的。
当然,如果要轻松地使两个缓冲区都可用,则还可以使用2个FlatBufferBuilder
实例。