Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C结构(C+;+;POD)和google protobufs之间的转换? 我有一些代码,现在通过很多(有时嵌套)C(或C++纯旧数据)结构和数组。_C++_C_Data Structures_Protocol Buffers_Idl - Fatal编程技术网

C结构(C+;+;POD)和google protobufs之间的转换? 我有一些代码,现在通过很多(有时嵌套)C(或C++纯旧数据)结构和数组。

C结构(C+;+;POD)和google protobufs之间的转换? 我有一些代码,现在通过很多(有时嵌套)C(或C++纯旧数据)结构和数组。,c++,c,data-structures,protocol-buffers,idl,C++,C,Data Structures,Protocol Buffers,Idl,我想把这些转换成谷歌protobufs。我可以手动编写在这两种格式之间进行转换的代码,但自动生成这样的代码的错误可能性较小。最好的方法是什么?(这将是一个容易用自省的语言来迭代成员变量的名称,但这是我们正在谈论的C++代码) 我正在考虑的一件事是编写python代码来解析C结构,然后生成一个.proto文件,以及为所有类型从一个成员复制到另一个成员(在任意方向)的C代码,但也许有更好的方法。。。或者可能还有另一个IDL已经可以生成: 包含所有嵌套类型的.h文件 .proto文件,其中包含等效文件

我想把这些转换成谷歌protobufs。我可以手动编写在这两种格式之间进行转换的代码,但自动生成这样的代码的错误可能性较小。最好的方法是什么?(这将是一个容易用自省的语言来迭代成员变量的名称,但这是我们正在谈论的C++代码) 我正在考虑的一件事是编写python代码来解析C结构,然后生成一个.proto文件,以及为所有类型从一个成员复制到另一个成员(在任意方向)的C代码,但也许有更好的方法。。。或者可能还有另一个IDL已经可以生成:

  • 包含所有嵌套类型的.h文件
  • .proto文件,其中包含等效文件
  • C++文件具有在.c++结构中生成.file文件和.h文件中定义的结构之间的任一方向的函数。
    协议缓冲区可以通过使用解析ASCII表示来构建。因此,一个选项是向每个结构添加一个方法
    dumpAsciiProtoBuf
    。该方法将转储任何简单字段(如字符串、布尔等),并递归地调用嵌套结构字段上的
    dumpasciprotobuf
    。然后,您必须确保连接的结果是一个有效的ASCII协议缓冲区,可以使用进行解析


    但请注意,这可能会对性能产生一些影响(因为解析ASCII表示可能会很昂贵)。但是,这将为您省去用其他语言编写转换器的麻烦,因此这似乎是一个方便的解决方案。

    我找不到解决此问题的现成解决方案,如果有,请告诉我

    如果您决定使用python实现自己的应用程序,那么。然后可以读取符号表,查找指定文件中定义的所有结构,并迭代所有结构成员。 然后使用
    .strip\u typedefs()
    获取每个成员的基本类型,并将其转换为适当的protobuf类型

    这可能比文本解析器更安全,因为它将处理依赖于体系结构、编译器标志、预处理器宏等的类型


    我猜从protobuf转换到protobuf的代码也可以从struct member到message字段的关系中生成,但听起来并不容易。

    我自己不会解析C源代码,而是使用将C文件解析为一个和我自己的AST walker,根据需要生成和转码器。在谷歌上搜索“libclang walk AST”应该可以从一些东西开始,例如
    AST walker.cc
    AST dumper.cc
    ,谢谢你的回复。我认为C++类不能迭代它自己的成员变量,是吗?我试图避免维护在硬编码结构字段中迭代的多段代码。我有点困惑,您是在传递数据还是代码?如果您传递的只是数据,那么任何序列化库都有什么问题?如果您的数据需要用不同的语言阅读,我会考虑一些类似的代码:<代码> JSON<代码>或类似的内容。如果您对共享代码感兴趣,那么这是一个完全不同的问题。ROS使用Python和一些库来从消息生成C++类,我确信还有很多其他框架支持代码生成。你为什么要用protobuf?