【发布时间】:2020-09-09 15:17:41
【问题描述】:
我拥有的是:
- 一个十六进制文件,其中包含一个 c-struct 的字节,以大端序排列
- 结构定义为 *.h 文件
- 结构信息作为 dwarf2 调试信息
- 我的应用程序必须用 C/C++ 编写。使用例如 python 的中间脚本就可以了。
我要做的是读取 hex 文件的字节并将其转换为小端系统上的结构类型。 在这个过程中,我将不得不反转每个结构成员的字节。
显而易见的解决方案是编写一个转换函数,它为每个结构成员进行字节交换,但由于结构有多个层和约 1200 个成员的变化速度比我更新转换函数的速度要快,所以手动编写没有办法。
所以我可以通过以下方式自动生成转换函数:
- 查找和解析多个 *.h 文件中的类型
- 迭代所有结构类型的成员并为它们生成交换 -> 没有某种反射 api 不是那么容易)
- 通过转换函数加载结构。
由于这个解决方案看起来工作量很大,我一直在徘徊,是否有更简单的方法,比如告诉编译器交换它或以某种方式使用调试信息。
有人知道在这种情况下可能有帮助的技巧吗?
感谢和问候!
备注: 更改导致这种情况的任何流程/更改输入条件或将责任委派给所涉及的其他开发人员是不可行的。
- 无法将有关 hex 文件的某些内容更改为输入。此文件来自其他系统,不会更改以修复此问题。
- 填充、数据类型大小等是相同的。其他措施也确保了这一点。所以字节顺序无疑是唯一的问题。这也是为什么我认为没有理由反对使用 dwarf2 信息来识别每个结构成员的字节。
- 我同意结构的布局非常糟糕。但它有一些原因,而且简而言之,由于流程原因和向后兼容性,我可以/不允许不改变它。
提供更多范围:
使用所有这些的软件部署到多个不同的嵌入式设备(多种类型)。十六进制文件包含软件的校准信息,因此存储在只能输出该十六进制文件的特定系统中。 我现在将软件移植到一个小端设备,我必须使用从软件的“主”分支给出的十六进制文件,它是大端的,作为输入。
【问题讨论】:
-
使用适当的序列化库/系统。定义文件格式的语法。
-
这听起来像是一条很滑的路。如果文件是在具有不同编译器的不同架构上创建的,那么您在这里做出了太多假设。除了字节序之外,您确定结构布局、填充、数据类型大小等相同吗?
-
“结构有多个层和大约 1200 个成员,其变化速度比我更新转换函数的速度要快” 这听起来像是一个非常严重的问题,值得自己解决正确的。抽象在哪里?!
-
也许你需要温和地向你的同事介绍理智的概念,为了他们好。他们真的认为他们可以将一个巨大的结构二进制转储到一个文件中,而其他人将不得不编写一个软件来将该转储转换为另一个架构,同时跟踪他们所做的更改?在我的店里,任何有这种想法的人都非常欢迎收拾东西并立即离开。
-
"2. 迭代所有结构类型的成员并为它们生成交换" -
magic_get可能可以做到。