1、正文部分
1
話題引出
技術交流群一個小哥貼出了如下圖片 :
?
問到了共聯體類型強制轉化的問題,當時bug菌點開看到這幾行代碼便產生了莫名的親切感,或許這些就是C語言的魅力所在吧。
其實這種操作在通信協議中拆包、解包是非常常見的,但是筆者也是在參加工作以后在部門的代碼中get到,所以這里整理分享給各位。
2
操作解析
有認真閱讀過筆者公眾號文章的小伙伴,應該在其他文章中也看到過這種操作,不過比較分散,今天抽出來再好好聊聊!
1
buff直接轉結構體
上圖是簡單的協議包,包括幀頭,長度和數據部分,在通信數據接收或者發送末端其都位于字節流中,比如UART通信,最后都是放到Sendbuff[N]或者RecBuff[N],然后發送出去。
如果你打包好了結構體,然后一個個填充byte到發送或者接受buff,著實有點麻煩,然而通過結構體指針強制類型轉換為uint8_t *pSendBuff;然后在進行字節流發送,那就簡潔很多了。
當然在此過程中你還要注意字節序、對齊等等,在往期的文章中bug菌都有講到,模擬此過程參考下面代碼。
參考示例:
#include#include #pragmapack(1) typedefstruct_tag_Pack { intHead; intLen; charData[2]; }sPack; intmain(intargc,char*argv[]){ sPackstSendPack; sPack*pstRevPack=NULL; unsignedchar*SendBuff=NULL; unsignedcharRevBuff[20]={0}; intcnt=0; //模擬封包 stSendPack.Head=0xFF; stSendPack.Len=0x08; stSendPack.Data[0]=0x1; stSendPack.Data[1]=0x2; //模擬發送包 SendBuff=(unsignedchar*)(&stSendPack); printf("SendData:"); for(cnt=0;cntHead); printf("pstRevPack.Len=0x%X ",pstRevPack->Len); printf("pstRevPack.Data[0]=0x%X ",pstRevPack->Data[0]); printf("pstRevPack.Data[1]=0x%X ",pstRevPack->Data[1]); printf(" 歡迎關注公眾號:最后一個bug "); return0; }
運行結果:
2
buff直接轉結構共聯體
上一節我們談到了接受和發送的buff直接轉結構體,然后進行解包處理,而交流群里面圖片中是轉共聯體,可以說這樣的數據結構結合是非常完美的。
buff轉結構體類型,就必須buff字節流里的格式與結構體一致,才能正確的解析,而共聯體是一種復合類型結構,可以存在多種形式的數據提取,這樣就可以帶來更多的靈活度,下面代碼在操作一波。
參考示例:
#include#include #pragmapack(1) typedefstruct_tag_PackType1 { intHead; intLen; charData[2]; }sPackType1; typedefstruct_tag_PackType2 { intHead; intLen; intData[2]; }sPackType2; typedefstruct_tag_PackType3 { intHead; intLen; floatData[2]; }sPackType3; //結構共聯體 typedefunion_tag_PackType { sPackType1stPackType1; sPackType2stPackType2; sPackType3stPackType3; }uPackType; //不同結構體類型的解析函數 voidParsePackType1(uPackType*punPackType) { punPackType->stPackType1.Head=0xF1; //you do something! } voidParsePackType2(uPackType*punPackType) { punPackType->stPackType2.Head=0xF2; //you do something! } voidParsePackType3(uPackType*punPackType) { punPackType->stPackType3.Head=0xF3; //you do something! } /****************************************** *Fuction:Buff轉結構共聯體 *Author:(公眾號:最后一個bug) *****************************************/ intmain(intargc,char*argv[]){ uPackType*punPackType; unsignedcharRevBuff[20]={0}; //通信字節流接受到RevBuff以后強轉 punPackType=(uPackType*)RevBuff; //根據自身需要,不同的解析函數,統一傳遞共聯體即可 ParsePackType1(punPackType); ParsePackType2(punPackType); ParsePackType3(punPackType); printf(" 歡迎關注公眾號:最后一個bug "); return0; }
以上就是今天的全部內容,enjoy!
審核編輯:劉清
-
C語言
+關注
關注
180文章
7604瀏覽量
136824 -
uart通信
+關注
關注
0文章
19瀏覽量
7003
原文標題:結構體嵌入共聯體在協議解析中的技術性操作~
文章出處:【微信號:嵌入式情報局,微信公眾號:嵌入式情報局】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論