最近的项目用到UDP接收结构体,以为和普通的传送字符串的一样,没想到我还是太天真。要能够接收或者传送结构体,一个很重要的知识点是:结构体字节对齐。废话不多说,小课堂开始了!
结构体对齐
参考https://www.cnblogs.com/codingnutter/p/5634482.html
许多计算机系统对基本数据类型合法的进行了一些限制,要求某种类型对象的地址必须是某个值(通常是2,4 和8)的倍数。这种对齐简化了形成处理器与存储系统之间的接口的硬件设计。当数据结构为结构体时,为了满足这种数据对齐的机制,编译器可能需要在结构体的字段的分配中插入间隙--向结构体中最大的元素对齐。typedef struct
{
char c;
int i[2];
double v;
}S; 看上面的结构体,在没有数据对齐的情况下,size()=1+4*2+8=17字节。
再编译器数据对齐处理后,他的结构大小变成了24字节(向结构体中最大的元素对齐),内存布局为
这个就是为什么我强转后,结构体中的部分数据是乱码的。
UDP发送和接收结构体消息
知道结构体的数据对齐的处理后,我们知道不能进行强转了,那么该怎么做呢?
我的做法是:将struct中的元素按字节大小一个个的存放到QByteArray中,QByteArray是连续的,接收时按大小再取出来就可以了。
直接上代码:
服务端(发送数据)//udpserver.h
#include
#include
#include
#include
#include
#define BYTE unsigned char
struct Test_data{
int iNumber;
char arrchResult[45];
char arrchCode[12];
bool bOutLi