• 正文
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

聯(lián)合體和結(jié)構(gòu)體一起解析數(shù)據(jù)

01/27 10:50
624
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

聯(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)體。

struct test_data1
{
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


{

uint8_t data_bytes[100];

struct test_data1 analysis_data1;

struct test_data2 analysis_data2;

} data;

使用__attribute__ ((__packed__))使字節(jié)不對(duì)齊,使用位域來表示三個(gè)字節(jié),__attribute__ ((__packed__))和結(jié)構(gòu)體位域可以參考:

結(jié)構(gòu)體位域和__attribute__ ((__packed__))一起用

根據(jù)數(shù)據(jù)值直接使用結(jié)構(gòu)體賦值

memcpy(data.data_bytes, receive, 100);

if(data.data_bytes[0] == 0x01)

{

xxx = data.analysis_data1.data_xxx

}

else if(data.data_bytes[0] == 0x02)

{

xxx = data.analysis_data2.data_xxx

}
else if(data.data_bytes[0] == 0x03)
{
xxx = data.analysis_data3.data_xxx
}

這樣使用聯(lián)合體方便簡(jiǎn)化數(shù)據(jù)解析。

相關(guān)推薦