聯(lián)合體是一種數(shù)據(jù)結(jié)構(gòu),其內(nèi)部的成員共享同一塊內(nèi)存。應(yīng)用這種方式可以簡(jiǎn)化多種復(fù)雜數(shù)據(jù)的處理。
比如接收一段16進(jìn)制到的數(shù)據(jù),根據(jù)幀頭不同數(shù)據(jù)的含義不同需要進(jìn)行解析;第一個(gè)字節(jié)為0x01時(shí),后兩個(gè)字節(jié)代表一個(gè)含義;第一個(gè)字節(jié)為0x02時(shí),后四個(gè)字節(jié)代表另一個(gè)含義;第一個(gè)字節(jié)為0x03時(shí),后3個(gè)字節(jié)代表另一個(gè)含義。首先定義幾個(gè)結(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é)不對(duì)齊,使用位域來表示三個(gè)字節(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)合體方便簡(jiǎn)化數(shù)據(jù)解析。