ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-09-05 11:39:26  阅读:260  来源: 互联网

标签:总结 字节 int str 体位 大小 单字节 com yaabou



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

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

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

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

 

 

标签:总结,字节,int,str,体位,大小,单字节,com,yaabou
来源: https://blog.csdn.net/zuo_an/article/details/100554113

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有