首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

怎么阻止结构体自动对齐,以及大小端处理

2013-04-02 
如何阻止结构体自动对齐,以及大小端处理?我定义了一个结构体, 包含一个unsigned short和一个unsigned int,

如何阻止结构体自动对齐,以及大小端处理?
我定义了一个结构体, 包含一个unsigned short和一个unsigned int, 我的理想是6个字节, 但是由于对齐成了8个字节.
问题是我要将一个字节流赋值进这个结构体, 字节流前两个字节是一个数值, 后4个字节是一个数值.
例如: 0x00, 0x01,     0x00, 0x00, 0x00, 0x01 理想是两个值1, 1
我的代码简化如下


#include<stdio.h>
#include<string.h>
typedef struct _STDATA
{
    unsigned short us;
    unsigned int ui;
} STDATA;
void func(void *buf)
{
    STDATA st;
    int len = sizeof(STDATA);
    memcpy(&st, buf, len);
}
int main()
{
    unsigned char s[10] = {0x00, 0x01, 0x00, 0x00, 0x00, 0x01,0x00, 0x00, 0x00, 0x00};
    func((void *)s);
    return 0;
}

len获取到的大小是8而不是6.
st的两个值分别获得了0x00, 0x01, 0x00, 0x00.
然后是大小端问题, 我的理想如果是这种情况, 应该得到65536, 而不是256.
但是us和ui得到的值都是256...
求解m(_ _)m c
[解决办法]
可以用一个变通的方法,使用字节数组代替结构体,比如BYTE b[6];随后再分解为结构体中对应的变量
[解决办法]
1. 有防止结构体对齐的方法,但是不建议,因为会造成cpu的memory misaligned
2. 序列化成文本,以防止大小端问题。
3. 在网络上流/数据包统一用大端字节序,在序列化和反序化做相应的字节序转换。不要图省事,直接在buf和对象直接转换。 

[解决办法]
#pragma pack ( push )
#pragma pack ( 1 )

struct XXXX
{
};

#pragma pack ( pop )

热点排行