【发布时间】:2019-05-12 15:40:29
【问题描述】:
我的目的是构建一个配置文件。所以我基本上必须以某种方式表示命令包结构。
当实际数据(二进制)到来时,我想将数据包与此配置文件进行比较,然后对其进行处理(将数据转换为 CSV 格式)。
所以有不同的命令类型。
所以每次收到一个数据包时,我都必须获取它的操作码并用配置文件检查它并返回代表该数据包格式的适当命令格式。
命令格式可能如下所示:
操作码 - 1 个字节 - 整数
命令 - 4 字节 - 字符串
...
所有命令的字段数或格式不同。
我想检索所有这些详细信息。我可以用 XML 表示它并使用 libxml2 之类的库对其进行解析。
下面给出了一个示例 XML 格式:
<cmd type="Multiplication">
<field name="opcode" type="string" bytes="4"/>
<field name="Multiplicand" type="number" bytes="2"/>
<field name="Multiplier" type="number" bytes="2"/>
</cmd>
但这种方法相当缓慢。
我的想法是以某种方式在结构中表示命令包格式。但由于 C/C++ 不是反射语言,因此无法知道结构成员,并且您需要每个结构(命令)一个函数来解析它。
请提出一些存储格式的方法,这样一个通用函数就可以通过查看这种格式来解析二进制数据。
- 语言可以是 C 或 C++。
- 性能是重中之重,因此不鼓励使用 XML 和类似类型。
- 内存中的数据结构是首选。
非常感谢任何帮助。
【问题讨论】:
-
该数据结构的格式与解析后的处理方式相关,而不是解析本身。没有这些信息,很难回答这个问题。否则,答案就是:memcpy() 它在一个字节向量中,这可能不是你想要的。
-
我必须通过查看数据包格式将二进制数据解析为 csv 文件。
-
除了使用std::variant之外,我还需要说更多吗?
-
我同意 std::variant 在这种情况下可能是最好的解决方案,但我认为以前没有见过它的人可能需要更多关于如何使用它的解释。许多人第一次看到它时,他们的第一个倾向是使用 std::get 或 std::try_get(它们很麻烦)而不是仅仅使用 std::visit。即使是有经验的 C++ 用户,我也看到了这一点
标签: c++ c data-structures