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
另外,针对案例二,网上有帖子说直接调换序列不可行,但是笔者在大小端机型上写代码进行测试,经过验证是可行的。
同时也请其他网友考证,欢迎交流。
标签:总结,字节,int,str,体位,大小,单字节,com,yaabou 来源: https://blog.csdn.net/zuo_an/article/details/100554113