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

时间:2019-08-11 12:35:48

标签: c++ flatbuffers

我正在使用FlatBuffers反序列化包含联合结构之类的数据

struct ReqMsgUnion {
  ReqMsg type;
  void *value;
}

模式:

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

现在,我想使用memcopy()复制“值”,但是由于内部有一些“ \ 0”(如果我没记错的话),我无法获得“值”的正确大小。 我在Internet上搜索并找到了“在架构中添加dataLength”之类的方法,但是我想知道是否还有其他更好的主意。 谢谢!

2 个答案:

答案 0 :(得分:3)

没有办法void*中提取其指向的大小(也不包括其 actual 类型)。该信息(如果需要)必须以其他方式明确包含。<​​/ p>

在C ++中,一开始不要尝试使用void*

答案 1 :(得分:0)

您的问题还不清楚,似乎struct来自C / C ++代码,而table来自FlatBuffer模式。它们是不同的语言。

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

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