3. 结构体位域大小端总结


结构体内部如果是位域操作,在不同的平台也有大小端的问题。   

1. 案例一分析
                                                            小端格式  大端格式
    typedef struct yaabou_com {
        int a : 1;                                        低             高
        int b : 2;
        int c : 3;
        int d : 4;               
        int e : 5;
        int f : 6;
        int g : 11;                                       高             低
    }yaabou_com_str;
    
    yaabou_com_str str = {0};
    令:
    str.c = 1;
    str.g = 8;
    str.b = 2;
    小端格式
    内存分配:低字节在前  高字节在后
    单字节高 单字节低   单字节高 单字节低      单字节高 单字节低     单字节高 单字节低
    ddcccbba                  feeeeedd                       gggfffff                           gggggggg
    00001100                 00000000                      00000000                     00000001
    0x0c                          0x00                                0x00                              0x01
    数据:0x0100000c

    大端格式
    内存分配:高字节在前 低字节在后
    字节高段  字节低段  字节高段  字节低段     字节高段  字节低段    字节高段  字节低段 
    abbcccdd                   ddeeeeef                      fffffggg                           gggggggg
    01000100                   00000000                    00000000                     00001000
    0x44                            0x00                              0x00                             0x08
    数据:0x44000008

    2. 案例二分析             
                                                   小端格式  大端格式
    typedef truct test_u16{

        int c:12;                               低           高
        int b:1;
        int a:3;                                  高          低

    }test_u16_type;
    test_u16_type str16 = { 0 };
    令:
    str16.b = 1;
    str16.c = 2;
    str16.a = 1;
    小端格式
    内存分配:低字节在前  高字节在后
    字节高段 字节低段     字节高段  字节低段        
    cccccccc                      aaabcccc
    00000010                    00110000
    0x02                             0x30
    数据:0x3002

    大端格式
    内存分配:高字节在前 低字节在后
    字节高段 字节低段    字节高段  字节低段
    cccccccc                     ccccbaaa
    00000000                   00101001
    0x00                            0x29
    数据:0x0029

3. 总结分析

在不同的平台如果要进行转换,可以通过调换成员的存储序列达到数据解析的目的。

以上两个例子的定义分别如下:

案例一大小端定义:

#if CPU_MEMORY_MODE == LITTLEMODE //BIGMODE
typedef struct yaabou_com {
    int a : 1;
    int b : 2;
    int c : 3;
    int d : 4;
    int e : 5;
    int f : 6;
    int g : 11;
}yaabou_com_str;

#endif

#if CPU_MEMORY_MODE == BIGMODE //BIGMODE
typedef struct yaabou_com {
    int g : 11;
    int f : 6;
    int e : 5;
    int d : 4;
    int c : 3;
    int b : 2;
    int a : 1;
}yaabou_com_str;

#endif

案例二大小端定义:

#if CPU_MEMORY_MODE == LITTLEMODE //BIGMODE

typedef struct test_u16{
    int c : 12;
    int b : 1;
    int a : 3;
}test_u16_type;
#endif
#if CPU_MEMORY_MODE == BIGMODE //BIGMODE

typedef struct test_u16 {
    int a : 3;
    int b : 1;
    int c : 12;
}test_u16_type;
#endif

另外,针对案例二,网上有帖子说直接调换序列不可行,但是笔者在大小端机型上写代码进行测试,经过验证是可行的。

同时也请其他网友考证,欢迎交流。

 

 

你可能感兴趣的:(C语言)