- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2014-09-02 13:38 编辑
BetonArmEE 发表于 2014-09-02 11:49 ![]()
是的,对齐问题我原本要处理的,结果又写错了,我的原意是想写成#pragma pack(1)或#pragma pack(
不可以pack。
如果在小型机上,如sparc,rs-6000,HP。。。
经过pack的结构,是不能访问的,只要你动用里边的未对齐变量,立即core dumpped。。。。。。
可以做一个展开器,将网络传来的packed struct展开成正常的结构。我做过这个,挺麻烦的,不如序列化省事。
如果想你的工具通用,必须走 序列化/反序列化 的道路。。。。说的有点武断。道理是对的。
认真看一下17楼的建议。
给你一个例子:- #include <pack.h>
- #include <json_pack.h>
- #include "meta/st.tpl"
- #include "meta/st.stu"
- main()
- {
- ss_stu ss;
- char buf[512];
- JSON_OBJECT json=json_object_new_object();
- ss.c=1;
- ss.s.c=3;
- ss.s.bi=123456789012345;
- ss.i=12345;
- stu_to_json(json,&ss,ss_tpl,0,0); //序列化成JSON
- printf("json ss=%s\n",json_object_to_json_string(json));
- net_pack(buf,&ss,ss_tpl);//序列化成 string
- printf("ss=%s\n",buf);
- json_object_put(json);
- return 0;
- }
- st.stu:(结构文件)
- extern T_PkgType st_tpl[];
- typedef struct {
- char c;
- INT64 bi;
- } st_stu;
- extern T_PkgType ss_tpl[];
- typedef struct {
- char c;
- st_stu s;
- int i;
- } ss_stu;
- st.tpl:(模板文件)
- T_PkgType st_tpl[]={
- {CH_TINY,1,"c",0,-1},
- {CH_INT64,sizeof(INT64),"bi"},
- {-1,0,0,0}
- };
- T_PkgType ss_tpl[]={
- {CH_TINY,1,"c",0,-1},
- {CH_STRUCT,0,"s",(const char *)st_tpl},
- {CH_INT,sizeof(int),"i"},
- {-1,0,0,0}
- };
复制代码 运行结果:
./t_struct
json ss={ "c": "1", "s": { "c": "3", "bi": "123456789012345" }, "i": "12345" }
ss=1|3|123456789012345|12345|
这就是一个结构套结构的例子。
17-20行,打印整个结构体的值,是不是挺省事的?
如果需要,放到包里传就行了。
反序列化,同样省事。
模板和结构是由工具生成的。
开源。
|
|