怎么用c语言解析二进制文件

怎么用c语言解析二进制文件,第1张

//ver:1

//resv1:0

//signature:CUC

//type:69

//no:5

//resv2:0

//seq:4

//length:56

//int2,1

//int2,2

//int1,1

//int4,30

//int1,1

//int1,7

//str,beijing

//int2,1

//int2,4

//int1,1

//int4,60

//int1,1

//int1,7

//str,tianjin

//int4,80

//二进制文件b.bin是:

//00000000h: 01 43 55 43 45 00 05 00 00 00 00 04 00 00 00 38

//00000010h: 00 01 00 02 01 00 00 00 1E 01 07 62 65 69 6A 69

//00000020h: 6E 67 00 01 00 04 01 00 00 00 3C 01 07 74 69 61

//00000030h: 6E 6A 69 6E 00 00 00 50

#pragma comment(lib,"ws2_32")

#include <stdio.h>

#include <winsock2.h>

#pragma pack(push,1)

struct _D {

    char  ver

//  char  resv1

    char  signature[3]

    char  type

    short no

    char  resv2

    int   seq

    int   length

    short int2_0

    short int2_1

    char  int1_0

    int   int4_0

    char  int1_1

    char  int1_2

    char  str_0[7]

    short int2_2

    short int2_3

    char  int1_3

    int   int4_1

    char  int1_4

    char  int1_5

    char  str_1[7]

    int   int4_2

} d

#pragma pack(pop)

FILE *f

int main() {

    f=fopen("b.bin","rb")

    if (NULL==f) {

        printf("Can not open file b.bin!\n")

        return 1

    }

    fread(&d,sizeof(struct _D),1,f)

    fclose(f)

    printf("ver:%d\n"        ,d.ver)

    printf("resv1:0\n")

  迅友  printf("signature:%.3s\n",d.signature)

    printf("type:%d\n"       ,d.type)

    printf("no:%hd\n"        ,ntohs(d.no))

    printf("resv2:%d\n"      ,d.resv2)

    printf("seq:%d\n"        ,ntohl(d.seq))

    printf("length:%d\n"     ,ntohl(d.length))

    printf("int2_0:%hd\n"    ,ntohs(d.int2_0))

    printf("int2_1:%hd\n"    ,ntohs(d.int2_1))

    printf("int1_0:%d\n"     ,d.int1_0)

    printf("int4_0:%d\n"    悉型 ,ntohl(d.int4_0))

    printf("int1_1:%d\n"     ,d.int1_1)

    printf("int1_2:%d\n"     ,d.int1_2)

    printf("str_0:%.7s\n"    ,d.str_0)

    printf("int2_2:%hd\n"    ,ntohs(d.int2_2))

    printf("int2_3:%hd\n"    ,ntohs(d.int2_3))

    printf("int1_3:%d\n"     ,d.int1_3)

    printf("int4_1:%d\n"     ,ntohl(d.int4_1))

    printf("int1_4:%d\n"亩陆槐     ,d.int1_4)

    printf("int1_5:%d\n"     ,d.int1_5)

    printf("str_1:%.7s\n"    ,d.str_1)

    printf("int4_2:%d\n"     ,ntohl(d.int4_2))

    return 0

}

//ver:1

//resv1:0

//signature:CUC

//type:69

//no:5

//resv2:0

//seq:4

//length:56

//int2_0:1

//int2_1:2

//int1_0:1

//int4_0:30

//int1_1:1

//int1_2:7

//str_0:beijing

//int2_2:1

//int2_3:4

//int1_3:1

//int4_1:60

//int1_4:1

//int1_5:7

//str_1:tianjin

//int4_2:80

//

代码示例

//////////////////////////////////////////////////// /// 说明 : 解析XML文件 返回XML的根节点 /// 参数 : /// : xml xml文件路径 [in] /// : buffer 供解析用的缓冲 [in] /// : buffer_len 缓冲大小(单衫尘位:字节) [in] /// : error_reason 执行出错时保存错误袭塌蠢原因 [in] /// : root XML的根节点 [out] /// 返回 : 成功拍陪 返回 失败返回 /// 说明 : /// : 问 :供解析用的缓冲应该取多大比较合适呢? /// : 答 :供解析用的缓冲主要用来存放XML树 所以 buffer_len >= (XML文件的大小) * 即可 /// :

int mini_parse_xml (char* xml char* buffer int buffer_len char error_reason[ ] MINI_XML_NODE** root)

//////////////////////////////////////////////////// /// 说明 : 查找特定节点的子节点 /// 参数 : /// : father 父结点 [in] /// : name 子孩子节点名 [in] /// : child 子节点 [out]

int mini_find_child (MINI_XML_NODE* father char* name MINI_XML_NODE** child)

//////////////////////////////////////////////////// /// 说明 : 查找特定节点的属性值 /// 参数 : /// : node 节点 [in] /// : name 属性名 [in] /// : value 属性值 [out]

int mini_find_attribute (MINI_XML_NODE* node char* name char** value)

//////////////////////////////////////////////////// /// 说明 : 打印XML树 供调试用 int mini_print_tree (MINI_XML_NODE* root int layer)

#if defined (__cplusplus) || defined (c_plusplus) } #endif #endif

lishixinzhi/Article/program/net/201311/14908


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12273825.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存