Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用定义结构的C头文件解析数据_C_Parsing_Debugging_Data Structures - Fatal编程技术网

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

使用定义结构的C头文件解析数据,c,parsing,debugging,data-structures,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

我有一个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
二进制数据文件可能是这样的:

#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字段,因此我可以找出正确的结构以及它的长度。

您需要多长时间

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


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

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

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


你们似乎有固定长度的4个八位整数,以小端序排列,好吗

如果我假设具有nul终止符的变长字符串,
4a 61 63 6b 00=acName:“Jack”
0a 00=iDevID:0x0a
看起来不错,但它们之间有一个3个八位组的序列,我不知道它的含义

或者,
Jack
是否未以nul结尾,在这种情况下,它的长度固定为4个字符,而不是您为
NAME\u LEN
定义的8个字符?这将使
006f7065
成为另一个4字节的整数,但我仍然不知道它是什么意思


我认为最好是用C语言编写包含此头文件的内容,然后读取数据并将其转换为您的结构类型,然后再相应地显示。@谢谢您的帮助。。我需要将数据放入头文件的结构中,友好地显示,如Visual Studio,以便调试。。。我将使用结构中的一个字段来区分不同的结构类型…@AleksG YES,或者只是解析headerfile,数据将来自网络或文件,我有数据结构,数据中将有一个msgtype和一个msglenth字段,因此我可以找出哪个是正确的结构以及它的长度。仅供参考,GDB可以根据使用这些类型的二进制文件的DWARF调试信息几乎精确地显示您列出的信息。如果您将数据读取到内存中,将
PERSON*
设置到该数据并触发断点,GDB将很高兴地打印具有正确名称和值的结构(即使没有源代码),Dwarf符号是一个很好的线索。但是,您需要使用libdwarf创建二进制文件,这可能会添加很多内容。。。更简单的方法可能是编译一个包含静态结构的简单对象,并使用readelf、dwarfdump、objdump、pahole…这是
4a 61 63 6b 00 00
事实上,很抱歉我弄错了有很多不同的结构,数据来自网络或文件,数据中会有一个msgtype和一个msglenth字段,所以我可以找出哪个是正确的结构,它有多长。