使用定义结构的C头文件解析数据

时间:2012-02-20 16:49:25

标签: c parsing debugging data-structures

我有一个像这样的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 / whatever

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

2 个答案:

答案 0 :(得分:0)

你需要多么糟糕?

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

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

答案 1 :(得分:0)

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

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


你似乎有小端序的固定长度4个八位字节的整数,好的。

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

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

...