消除字节对齐

来源:互联网 发布:php用iis和apache 编辑:程序博客网 时间:2024/05/25 13:32

有时候我们要根据平台的协议,通过终端把一个结构体上报上去,但是由于编译器字节对齐的原因,有些结构体看起来并不是简单地类型字节的累加。如下

typedef struct{ INT32 Longitude;INT32 Latitude;UINT16 Speed;UINT16 Height;UINT16 ForDirect;UINT8 GPS_Year;UINT8 GPS_Month;UINT8 GPS_Day;UINT8 GPS_Hour;UINT8 GPS_Minute;UINT8 GPS_Second;UINT8 GPS_State;UINT32 WorkingTime;UINT8 GSM_State;UINT8 BAT_Voltage;UINT16 Input_Voltage;UINT16 Standby_Voltage;UINT8 GPS_Temperature;UINT32 Distance;INT16 Horizontal_angle;INT16 Vertical_angle;UINT8 Switch1;UINT8 Switch2;UINT8 Switch3; UINT8 WorkingState;INT16 LAC;INT16 CI;}gps_struct;//48BTYES

sizeof(gps_struct)就不是48BTYES。为了确保上传字节的准确性,方便平台的解析,我们有时候要消除字节对齐带来的影响。因此__attribute__( ( packed, aligned( 1 ) ) ),使得结构体按1字节对齐,从而符合直观地字节位置的分析。从而我们可以把上面的结构体改成

typedef struct{ INT32 Longitude;INT32 Latitude;UINT16 Speed;UINT16 Height;UINT16 ForDirect;UINT8 GPS_Year;UINT8 GPS_Month;UINT8 GPS_Day;UINT8 GPS_Hour;UINT8 GPS_Minute;UINT8 GPS_Second;UINT8 GPS_State;UINT32 WorkingTime;UINT8 GSM_State;UINT8 BAT_Voltage;UINT16 Input_Voltage;UINT16 Standby_Voltage;UINT8 GPS_Temperature;UINT32 Distance;INT16 Horizontal_angle;INT16 Vertical_angle;UINT8 Switch1;UINT8 Switch2;UINT8 Switch3; UINT8 WorkingState;INT16 LAC;INT16 CI;}__attribute__( ( packed, aligned( 1 ) ) )gps_struct;


0 0
原创粉丝点击