如何从平面缓冲区中反序列化联合结构的 void* 值的大小

How to get the size of union struct's void* value deserializes from flatbuffers

本文关键字:void 结构 平面 缓冲区 反序列化      更新时间:2023-10-16

我正在使用平面缓冲区来反序列化包含联合结构的数据,例如

struct ReqMsgUnion {
ReqMsg type;
void *value;
}

图式:

table Request {
seq_no: uint = 0;                          
msg: ReqMsg (required);
}

现在我想使用 memcopy() 来复制"值",但我无法获得正确的"值"大小,因为里面有一些"\0"(如果我没记错的话)。 我在互联网上搜索并找到类似"在架构中添加数据长度"的方法,但我想知道是否有其他更好的想法。 谢谢!

无法从void*中提取它指向的大小(或其实际类型)。该信息(如果需要)必须以其他方式明确包含。

尽量不要在C++首先使用void*

你的问题有点不清楚,似乎struct来自 C/C++ 代码,table来自 FlatBuffer 模式。它们不是同一种语言。

现在首先,您通常不能从 FlatBuffer 中复制任何内容。从 API 获取的任何内容,无论是联合还是表指针,都指向基础缓冲区中的某个位置,并且其大小未知。它可能指向缓冲区中在内存中不相邻的其他项。

在 flatBuffers API 中,你会得到一个void *,因为它可能指向多个不相关的表类型。您应该使用您获得的类型将其强制转换为实际的表类型。但就像我说的,即使你做了,你仍然无法复制它。