【发布时间】: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