阅读了yos的**《内存对齐问题学习小结》,深有体会,看来在进行指针操作时,必须进行强制类型转换,否则可能出现预想不到的错误。
在我的一个项目中,需要进行数据包解码,同样出现数据对齐的问题,却没能找到好的解决方法问题如下 CPU ARM7 ,编译环境 Keil RVCT3.0
#pragma pack(1) typedef struct { uint8 u8a[3]; uint8 u8b[4]; uint16 u16c; uint32 u32d; uint32 u32e; } TSTBLK,* PTSTBLK;
主程序 main { uint16 i; PTSTBLK pTST;
uint16 u16k; uint32 u32m,u32l; uint8 DBUF[200]; for(i= 0 ;i<200;i++)DBUF=i;
pTST=(PTSTBLK)DBUF; // 1 u16k = (pTST->u16c); // 2 u32m = pTST->u32d; // 3 u32l = pTST->u32e; // 4 //以下语句是避免 u16k,u32m,u32l被优化掉 i = u16k; i = (uint16)u32m; i = (uint16)u32l; }
运行语句1 后, 结构体中的 u8a[] = 0x00~0x02 u8a[] = 0x03~0x06 u16c = 0x0807 u32d = 0x0C0B0A09 u32e = 0x100F0E0D 显然以上结果是我们所需要的,正确! 但继续运行 2,3,4得到 u16k = 0x0706 u32m = 0x080B0A09 u32l = 0x0C0F0E0D 字节对齐发生了问题,乱了! 乱得还不轻 u32m 没有等于0x0B0A0908 u32m 没有等于0x0B0A0908 u32m 也没有等于0x0F0E0D0C why?
我试图用u16k = (uint16)(pTST->u16c); u32m = (uint32)pTST->u32d; 去修改,但无效! 其实pTST->u16c本身就是16位的,强制转到16位自然没有任何意义。
请问各位有好的处理方法吗?毕竟在数据解码中非对齐格式是很常见的! 谢谢各位
|