【问题标题】:Parse data with C header files which defined the structures使用定义结构的 C 头文件解析数据
【发布时间】:2012-03-11 00:27:58
【问题描述】:

我有一个这样的 C 头文件:

#define NAME_LEN 8
#define DEV_MAX  4

typedef struct __device
{
    int iDevID;
    int iDevSN;
}DEVICE;

typedef struct __person
{
    int iID;
    char acName[NAME_LEN];
    DEVICE aDevices[DEV_MAX];
}PERSON;

二进制数据文件可能是这样的:

0000000 01 00 08 00 4a 61 63 6b 00 00 00 00 0a 00 00 00
0000020 11 11 11 11 0b 00 00 00 22 22 22 22 0c 00 00 00
0000040 33 33 33 33 0d 00 00 00 44 44 44 44

我所需要的只是使用上面的 C 头文件使用字段名称来可视化数据表示...... 这样就更好了……

m--iID : 0x80001
m--acName : Jack
m--aDevices[]
|--aDevices[0]
|--|--iDevID : 0xa
|--|--iDevSN : 0x11111111
|--aDevices[1]
|--|--iDevID : 0xb
|--|--iDevSN : 0x22222222
|--aDevices[2]
|--|--iDevID : 0xc
|--|--iDevSN : 0x33333333
|--aDevices[3]
|--|--iDevID : 0xd
|--|--iDevSN : 0x44444444

或其他结构化数据 ..xml / python pickle / json strings / 不管什么

当然,我遇到的头文件要复杂得多,数据中会有一个msgtype和一个msglenth字段,所以我可以找出哪个是正确的结构以及它有多长。

【问题讨论】:

  • 我认为最好的办法是用 C 语言编写一些包含此头文件的内容,然后读取数据并将其转换为您的结构类型,然后再相应地显示它。
  • @Useless 感谢您的帮助。我需要将数据放入头文件中的结构中,友好显示,如 Visual Studio,用于调试...我将使用结构中的字段之一区分不同的结构类型...
  • @AleksG 是的,或者只是解析头文件,数据来自网络或文件,我有数据结构,数据中会有一个msgtype和一个msglenth字段,所以我可以找到找出哪个是正确的结构,它有多长。
  • 仅供参考,GDB 可以根据使用这些类型的二进制文件的 DWARF 调试信息几乎完全显示您列出的信息。如果您将数据读入内存,为该数据设置PERSON* 并触发断点,GDB 将愉快地打印具有正确名称和值的结构(即使没有源)
  • 矮人符号是个好线索。但是,您需要使用 libdwarf 创建二进制文件,这可能会添加很多东西......更容易的是编译一个包含静态结构的简单对象,并使用 readelf、dwarfdump、objdump、pahole......

标签: c parsing debugging data-structures


【解决方案1】:

你有多需要它?

可能的解决方案是制作 GCC 插件或 MELT 扩展(MELT 是扩展 GCC 的特定领域语言),但要做到这一点,您需要详细了解 GCC 的内部表示(尤其是 Tree,也许还有 Gimple),这将花费您一些时间(几天,而不是几小时)。

如果您的声明更简单,或许可以考虑使用SWIG(或者可能是 RPCXDR 解析器),但前提是您能够更改或简化它们。

【讨论】:

    【解决方案2】:

    如果二进制格式与您的结构的内存布局相同,您可以直接转换它,不需要解析(有一些警告)。但是,这显然不是您的意思,因为您的十六进制转储和示例输出与该解释不匹配。

    您需要实际解释您的格式:如下所述,它并不明显。


    你似乎有固定长度的 4 字节整数,以小端顺序排列,好的。

    如果我假设带有 nul 终止符的可变长度字符串,4a 61 63 6b 00 = acName:"Jack"0a 00 00 00 = iDevID:0x0a 看起来没问题,但它们之间有一个 3 字节的序列,我不知道它的含义。

    或者Jack 不是 nul 终止的,在这种情况下,它固定为 4 个字符长,而不是您为 NAME_LEN 定义的 8 个字符?这将使00 6f 70 65 成为另一个 4 字节整数,但我仍然不知道它是什么意思。

    ...

    【讨论】:

    • 其实是4a 61 63 6b 00 00 00 00,对不起
    • 有很多不同的结构,数据会来自网络或文件,数据中会有一个msgtype和一个msglenth字段,所以我可以找出哪个是正确的结构和它有多长.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2017-09-27
    • 1970-01-01
    相关资源
    最近更新 更多