聯(lián)合體是一種數(shù)據(jù)結(jié)構(gòu),其內(nèi)部的成員共享同一塊內(nèi)存。應(yīng)用這種方式可以簡化多種復(fù)雜數(shù)據(jù)的處理。
比如接收一段16進(jìn)制到的數(shù)據(jù),根據(jù)幀頭不同數(shù)據(jù)的含義不同需要進(jìn)行解析;第一個字節(jié)為0x01時,后兩個字節(jié)代表一個含義;第一個字節(jié)為0x02時,后四個字節(jié)代表另一個含義;第一個字節(jié)為0x03時,后3個字節(jié)代表另一個含義。首先定義幾個結(jié)構(gòu)體。
{
uint8_t header;
uint16_t data_xxx;
...
}__attribute__ ((__packed__));
struct test_data2
{
uint8_t header;
uint32_t data_xxx;
...
}__attribute__ ((__packed__));
struct test_data3
{
uint32_t header:8;
uint32_t data_xxx:24;
...
}__attribute__ ((__packed__));
typedef union
使用__attribute__ ((__packed__))使字節(jié)不對齊,使用位域來表示三個字節(jié),__attribute__ ((__packed__))和結(jié)構(gòu)體位域可以參考:
結(jié)構(gòu)體位域和__attribute__ ((__packed__))一起用
根據(jù)數(shù)據(jù)值直接使用結(jié)構(gòu)體賦值
else if(data.data_bytes[0] == 0x03)
{
xxx = data.analysis_data3.data_xxx
}
這樣使用聯(lián)合體方便簡化數(shù)據(jù)解析。