导航

1字节对齐的坑能有多大

这个问题定位出来可把我🐂🍺坏了

这是我声明的结构体,区别就在于这个结构体是否一字节对齐

struct clubReply {
    u8 cmd;
    u8 md5[16];
    u32 size;
    u8 data[0];
}__attribute__((packed));

 

当我设置一字节对齐的时候,正确的数据如下

now
02
64f3b1e85436228da95d272e8d1b4660
20000000
03000000
03030304
02020203
01010101
03000000
1e010203
14010101
0a010101

 

当我没有设置一字节对齐的时候,错误数据如下

wrong
02
64f3b1e85436228da95d272e8d1b4660
000000
20000000
03000000
03030304
02020203
01010101
03000000
1e010203
14010101
0a

 

该指针在size之前补齐了3字节

........

 

这个问题奇葩就奇葩在,传输的数据出现问题可能在好几个环节,加解密没有问题,都是错误数据,写入到struct clubReply的data也是没有问题的,我是完全没有想到struct clubReply的其他数据出现了问题,因为那些个赋值很简单

 

但因为struct clubReply除了用来读数据,还用来填写数据,填充报文时,结构体必须一字节对齐,得亏之前开发协议的经验,留心的地方我埋得很深的地方有数。

 

posted on 2021-05-11 16:15  toughcactus  阅读(230)  评论(0)    收藏  举报