結構體內部如果是位域操作,在不同的平台也有大小端的問題。
1. 案例一分析
小端格式 大端格式
typedef struct yaabou_com yaabou_com_str;
yaabou_com_str str = ;
令: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_u16test_u16_type;
test_u16_type str16 = ;
令: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 yaabou_com_str;
#endif
#if cpu_memory_mode == bigmode //bigmode
typedef struct yaabou_com yaabou_com_str;
#endif
案例二大小端定義:
#if cpu_memory_mode == littlemode //bigmode
typedef struct test_u16test_u16_type;
#endif
#if cpu_memory_mode == bigmode //bigmode
typedef struct test_u16 test_u16_type;
#endif
另外,針對案例二,網上有帖子說直接調換序列不可行,但是筆者在大小端機型上寫**進行測試,經過驗證是可行的。
同時也請其他網友考證,歡迎交流。
結構體位域
c語言允許在結構體中以位為單位設定成員所佔的記憶體空間。以位為單位的成員,簡稱為位域或位段 bit field 其優點是較少的位數儲存資料從而節省空間,還可以進行記憶體對齊。例如下列結構體內的變數使用了位域,占用空間只有1位元組 8bit 相對於不使用位域的縮少了3位元組 24bit 的資料。str...
c語言結構體位域
位域 有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾個不同的區域,並說明每個區...
大小端 位域
小端 低位 lsb 位於低位址 大端 高位 msb 位於低位址 x86一般使用小端模式 位域 typedef union liteu32 t test t 位域的分配 小端 從lsb msb,從低位址到高位址 大端 從msb lsb,從高位址到低位址 例如 test t tt tt.t 0x3f p...