在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
mystruct p;
或者 (将字节流转化成结构体) msg_header_t msgRecved; num = data_recv(fd,(void *)buf,sizeof(msg_header_t)); memcpy(&msgRecved,buf,sizeof(msg_header_t));
经常需要在程序中将远程传来的字节流进行结构化,或者将结构化的数据变成字节流传给远程主机。 在C/C++程序中,结构化数据通常用结构体来组织,结构体也能够方便的转换为字节流,因此结构化的数据传输本不该成为问题, 但在VC或GCC的默认设置下编译出的程序,却有一个值得注意的问题——结构体的对齐。 结构体的对齐是编译器为加快程序运行,在结构体中填入一些空白字节,是的结构体成员按一定规则对齐。
内存对齐的问题:
重要的是,数据是否有拿對。
自然对齐,是变量的内存地址,正好是它类型长度的整数倍;
对于结构体,
若采用
struct std{
char data[9];
int person;
}__attribute__((aligned (1)));
struct std my_std;
printf("size of my student = %d\n",sizeof(my_std)); ===>结果是16
struct std1{
char data[9];
int person;
}__attribute__((packed));
struct std1 my_std1;
printf("size of my student1 = %d\n",sizeof(my_std1));===>结果是13
若没有__attribute__((packed)),则按照四字节对齐,
举例
std结构体中data 为4字节对齐的字节流数据;
int len;
len = *(int *)&data[7];
7非4的整数倍,就会出现拿不到想要的数据问题;
data[4] data[5] data[6] data[7] 用上述方法拿到的数据一样。
前面的*(int*) 相当与一个“耦煤器“ ,它不会从地址对齐的当前块跨越到下一块。
修改成:
char len[4];
memset(len,0,sizeof(len));
memcpy(len,&data[7],sizeof(len));
则能拿到想要的数据;
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论