struct s_DEMO{
char branchcode[10+1];
int boxno;
char currencytype[2+1];
char deonminationcode[2+1];
char mainbitflag[1+1];
double recvoccurquantum;
double payeroccurquantum;
double balance;
double yesterdaybalance;
char recordstate[1+1];
};
1、定义 s_DEMO s_demo,并对其赋值
2、将s_demo的地址传入到一个函数ExpStrByDef_Demo(&s_demo)
函数的申明:ExpStrByDef_Demo(char *buf)
3、假设我已知道所传入的buf实际上是包含了如结构体所定义的每个元素的类型、长度.
例如第一个域为char,长度11,第二个为int,第三个为char,长度为3,......,第6个double,......
暂时所定的类型有int、long、char、double,除char外,其他类型无指定长度
4、请问,我如何在ExpStrByDef_Demo函数中根据已知的各字段类型来解析buf的内容,
例如,我要获取buf的第1个域值、第2域的值、第3个域的值......
我的机器是64位的,数据库也是64位的,使用的语言为C语言
我自己大体知道个思路,就是按各类型所占的位数逐个的在buf中截取,但是对于int、long、double的处理
本人就有些知识匮乏了,请高手指点,最好能贴出实例,不甚感激
18 个解决方案
#1
#2
可以试一下强制转换,编译器会根据数据类型计算偏移地址
ExpStrByDef_Demo(char *buf)
{
struct s_DEMO *p = (struct s_DEMO*)buf;
p->...
}
ExpStrByDef_Demo(char *buf)
{
struct s_DEMO *p = (struct s_DEMO*)buf;
p->...
}
#3
我在函数中一定得把buf当作字符串处理,不能与任何的数据结构struct对应,因为那个函数是个接口性质的,不能动态的与某个struct对应上
#4
可以试一下强制转换,编译器会根据数据类型计算偏移地址
ExpStrByDef_Demo(char *buf)
{
struct s_DEMO *p = (struct s_DEMO*)buf;
p->...
}
ExpStrByDef_Demo(char *buf)
{
struct s_DEMO *p = (struct s_DEMO*)buf;
p->...
}
#5
//方法一:
void ExpStrByDef_Demo(char *buf)
{
s_DEMO *kk=(s_DEMO *)buf;
printf("%s,%d\n",kk->branchcode,kk->boxno);
}
void ExpStrByDef_Demo(char *buf)
{
char branchcode[11];
int boxno;
memcpy(branchcode,buf,11);
memcpy(&boxno,buf+11,sizeof(int));
}
//不知道有没有解释清楚
//QQ:7199963
#6
我试试5楼的
#7
如果不能和struct类型对应,我觉得可以通过sizeof(int)等来计算偏移量
在取int时
比如:
char *p = buf + 9;
int *pi = (int *)p;
具体的字节顺序与大小,编译器会自动做的。
不知道这样是否可以?
不过我觉得如果不与struct类型对应,那么传入的字符串,其前面的内容应该是固定已知的。
这点类似于struct sockaddr之间sockaddr_in的关系。
在取int时
比如:
char *p = buf + 9;
int *pi = (int *)p;
具体的字节顺序与大小,编译器会自动做的。
不知道这样是否可以?
不过我觉得如果不与struct类型对应,那么传入的字符串,其前面的内容应该是固定已知的。
这点类似于struct sockaddr之间sockaddr_in的关系。
#8
这个用void*指针比较好
用char*指针,代入时需要强制类型转换ExpStrByDef_Demo((char*)&s_demo)
ExpStrByDef_Demo(void *buf)
{
buf=(struct s_DEMO *)buf;
buf->branchcode;//就是s_demo.branchcode,对buf->branchcode的操作作用在s_demo.branchcode上
buf->boxno;//就是s_demo.boxno
....
}
用char*指针,代入时需要强制类型转换ExpStrByDef_Demo((char*)&s_demo)
ExpStrByDef_Demo(char *buf)
{
buf=(struct s_DEMO *)buf;
buf->branchcode;//就是s_demo.branchcode
buf->boxno;//就是s_demo.boxno
....
}
#9
这个需要不同的机子得出不同的结构对齐方式以及int,double,float等的字节数。
然后获得每个字段的偏移量,就ok了。
我们的项目就这样实现了对结构赋值的可配置化。
然后获得每个字段的偏移量,就ok了。
我们的项目就这样实现了对结构赋值的可配置化。
#10
可以的,然后根据需要,再转换相关字段成为Int,double
#11
函数里面将buf强转成结构体不啥都解决了么 ,又不会动你的接口。
#12
ExpStrByDef_Demo(&s_demo)
这样传直接memcpy不就行了????
这样传直接memcpy不就行了????
#13
其实喃..所有指针类型都是 unsigned long 你传的时候强制转换,要用的时候再强制转换回来..
或者把ExpStrByDef_Demo(char *buf)改为ExpStrByDef_Demo(void*buf)
或者把ExpStrByDef_Demo(char *buf)改为ExpStrByDef_Demo(void*buf)
#14
如果直接按char*处理,需要考虑结构体字节对齐。
还是在你那个函数中先强制转成s_DEMO *的指针类型,就可以访问各成员了,不用考虑对齐。
还是在你那个函数中先强制转成s_DEMO *的指针类型,就可以访问各成员了,不用考虑对齐。
#15
9楼和7楼的能否说清楚点嘛,尤其是9楼,能否说说你们是怎么作的?qq 51770574
#16
我再解释下我需要的
1、在那个函数中是不知道buf是与那个结构体对应的
2、我想要得到的结果是,只知道buf可能是由一些char、int、long型的数值组合而成的一个地址连续的字符串,buf的首地址也即是这些组合的首地址
3、假设知道第一个变量的类型为char,第2个变量的类型为int,第3个变量为char,第4个变量类型为long,……
对应要有如下的结果:
char str1=第一个值
int i=第2个值
char str2=第3个值
long l=第4个值
……
不知道我这样讲,大家明白了没
5楼的我试了,不可以
1、在那个函数中是不知道buf是与那个结构体对应的
2、我想要得到的结果是,只知道buf可能是由一些char、int、long型的数值组合而成的一个地址连续的字符串,buf的首地址也即是这些组合的首地址
3、假设知道第一个变量的类型为char,第2个变量的类型为int,第3个变量为char,第4个变量类型为long,……
对应要有如下的结果:
char str1=第一个值
int i=第2个值
char str2=第3个值
long l=第4个值
……
不知道我这样讲,大家明白了没
5楼的我试了,不可以
#17
5 楼的可以啊,你只试用了方法一
试用了方法二吗?????????
试用了方法二吗?????????
#18
结构体不可以直接调用&s_demo吧?
#1
#2
可以试一下强制转换,编译器会根据数据类型计算偏移地址
ExpStrByDef_Demo(char *buf)
{
struct s_DEMO *p = (struct s_DEMO*)buf;
p->...
}
ExpStrByDef_Demo(char *buf)
{
struct s_DEMO *p = (struct s_DEMO*)buf;
p->...
}
#3
我在函数中一定得把buf当作字符串处理,不能与任何的数据结构struct对应,因为那个函数是个接口性质的,不能动态的与某个struct对应上
#4
可以试一下强制转换,编译器会根据数据类型计算偏移地址
ExpStrByDef_Demo(char *buf)
{
struct s_DEMO *p = (struct s_DEMO*)buf;
p->...
}
ExpStrByDef_Demo(char *buf)
{
struct s_DEMO *p = (struct s_DEMO*)buf;
p->...
}
#5
//方法一:
void ExpStrByDef_Demo(char *buf)
{
s_DEMO *kk=(s_DEMO *)buf;
printf("%s,%d\n",kk->branchcode,kk->boxno);
}
void ExpStrByDef_Demo(char *buf)
{
char branchcode[11];
int boxno;
memcpy(branchcode,buf,11);
memcpy(&boxno,buf+11,sizeof(int));
}
//不知道有没有解释清楚
//QQ:7199963
#6
我试试5楼的
#7
如果不能和struct类型对应,我觉得可以通过sizeof(int)等来计算偏移量
在取int时
比如:
char *p = buf + 9;
int *pi = (int *)p;
具体的字节顺序与大小,编译器会自动做的。
不知道这样是否可以?
不过我觉得如果不与struct类型对应,那么传入的字符串,其前面的内容应该是固定已知的。
这点类似于struct sockaddr之间sockaddr_in的关系。
在取int时
比如:
char *p = buf + 9;
int *pi = (int *)p;
具体的字节顺序与大小,编译器会自动做的。
不知道这样是否可以?
不过我觉得如果不与struct类型对应,那么传入的字符串,其前面的内容应该是固定已知的。
这点类似于struct sockaddr之间sockaddr_in的关系。
#8
这个用void*指针比较好
用char*指针,代入时需要强制类型转换ExpStrByDef_Demo((char*)&s_demo)
ExpStrByDef_Demo(void *buf)
{
buf=(struct s_DEMO *)buf;
buf->branchcode;//就是s_demo.branchcode,对buf->branchcode的操作作用在s_demo.branchcode上
buf->boxno;//就是s_demo.boxno
....
}
用char*指针,代入时需要强制类型转换ExpStrByDef_Demo((char*)&s_demo)
ExpStrByDef_Demo(char *buf)
{
buf=(struct s_DEMO *)buf;
buf->branchcode;//就是s_demo.branchcode
buf->boxno;//就是s_demo.boxno
....
}
#9
这个需要不同的机子得出不同的结构对齐方式以及int,double,float等的字节数。
然后获得每个字段的偏移量,就ok了。
我们的项目就这样实现了对结构赋值的可配置化。
然后获得每个字段的偏移量,就ok了。
我们的项目就这样实现了对结构赋值的可配置化。
#10
可以的,然后根据需要,再转换相关字段成为Int,double
#11
函数里面将buf强转成结构体不啥都解决了么 ,又不会动你的接口。
#12
ExpStrByDef_Demo(&s_demo)
这样传直接memcpy不就行了????
这样传直接memcpy不就行了????
#13
其实喃..所有指针类型都是 unsigned long 你传的时候强制转换,要用的时候再强制转换回来..
或者把ExpStrByDef_Demo(char *buf)改为ExpStrByDef_Demo(void*buf)
或者把ExpStrByDef_Demo(char *buf)改为ExpStrByDef_Demo(void*buf)
#14
如果直接按char*处理,需要考虑结构体字节对齐。
还是在你那个函数中先强制转成s_DEMO *的指针类型,就可以访问各成员了,不用考虑对齐。
还是在你那个函数中先强制转成s_DEMO *的指针类型,就可以访问各成员了,不用考虑对齐。
#15
9楼和7楼的能否说清楚点嘛,尤其是9楼,能否说说你们是怎么作的?qq 51770574
#16
我再解释下我需要的
1、在那个函数中是不知道buf是与那个结构体对应的
2、我想要得到的结果是,只知道buf可能是由一些char、int、long型的数值组合而成的一个地址连续的字符串,buf的首地址也即是这些组合的首地址
3、假设知道第一个变量的类型为char,第2个变量的类型为int,第3个变量为char,第4个变量类型为long,……
对应要有如下的结果:
char str1=第一个值
int i=第2个值
char str2=第3个值
long l=第4个值
……
不知道我这样讲,大家明白了没
5楼的我试了,不可以
1、在那个函数中是不知道buf是与那个结构体对应的
2、我想要得到的结果是,只知道buf可能是由一些char、int、long型的数值组合而成的一个地址连续的字符串,buf的首地址也即是这些组合的首地址
3、假设知道第一个变量的类型为char,第2个变量的类型为int,第3个变量为char,第4个变量类型为long,……
对应要有如下的结果:
char str1=第一个值
int i=第2个值
char str2=第3个值
long l=第4个值
……
不知道我这样讲,大家明白了没
5楼的我试了,不可以
#17
5 楼的可以啊,你只试用了方法一
试用了方法二吗?????????
试用了方法二吗?????????
#18
结构体不可以直接调用&s_demo吧?