在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

結構體嵌入共聯體在協議解析中的技術性操作過程

嵌入式情報局 ? 來源:最后一個bug ? 2024-02-25 15:00 ? 次閱讀

1、正文部分

1

話題引出

技術交流群一個小哥貼出了如下圖片 :

73dfcd60-d310-11ee-a297-92fbcf53809c.png ? 73f2f610-d310-11ee-a297-92fbcf53809c.png

問到了共聯體類型強制轉化的問題,當時bug菌點開看到這幾行代碼便產生了莫名的親切感,或許這些就是C語言的魅力所在吧。

其實這種操作在通信協議中拆包、解包是非常常見的,但是筆者也是在參加工作以后在部門的代碼中get到,所以這里整理分享給各位。

2

操作解析

有認真閱讀過筆者公眾號文章的小伙伴,應該在其他文章中也看到過這種操作,不過比較分散,今天抽出來再好好聊聊!

1

buff直接轉結構體

74178ab6-d310-11ee-a297-92fbcf53809c.png

上圖是簡單的協議包,包括幀頭,長度和數據部分,在通信數據接收或者發送末端其都位于字節流中,比如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;
}

運行結果:

74285774-d310-11ee-a297-92fbcf53809c.png

2

buff直接轉結構共聯體

743dc596-d310-11ee-a297-92fbcf53809c.png

上一節我們談到了接受和發送的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

原文標題:結構體嵌入共聯體在協議解析中的技術性操作~

文章出處:【微信號:嵌入式情報局,微信公眾號:嵌入式情報局】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    手動移液器的使用操作過程

    手動移液器的使用操作過程  手動移液器常見于臨床試驗和實驗室試驗,不同類型的移液器操作過程也有所不同,下面具體的解析一下。  一、使用方法:  1.根據所需取液量選擇相應移液器及吸液
    發表于 11-20 11:51

    電路板手工焊接操作過程

    `哪位大神可以分享電路板手工焊接的操作過程嗎?`
    發表于 02-29 15:14

    求ATmega168看門狗復位的具體操作過程

    ATmega168看門狗復位的具體操作過程
    發表于 11-18 07:17

    千萬注意!纖薄器件操作過程中損壞不得

    千萬注意!纖薄器件操作過程中損壞不得
    發表于 04-29 06:29

    怎樣去操作FTS-300光纜普查儀?操作過程中有哪些常見問題?

    FTS-300光纜普查儀的測試原理FTS-300光纜普查儀的功能應用范圍怎樣去操作FTS-300光纜普查儀?操作過程中有哪些常見問題?
    發表于 05-06 09:42

    C語言的平臺操作過程

    兩種學習C語言的平臺操作過程,在后續內容學習需要熟練應用。這兩種方式分別為:keil c51編程軟件+硬件調試平臺臺,,keilkeil c51c51編程軟件編程軟件+ proteusproteus軟件...
    發表于 07-20 06:19

    STM32內部FLASH操作過程

    一般說STM32內部FLASH就是指主存儲器區域寫內部FLASH操作過程解鎖在對FLASH寫數據之前,需要先給解鎖,因為芯片為了防止誤操作修改應用程序,復位之后會給控制寄存器FLASH_CR上鎖(1
    發表于 12-09 06:37

    GPIO輸入完成按鍵掃描的操作過程是怎樣的

    GPIO輸入完成按鍵掃描的操作過程是怎樣的
    發表于 02-08 07:29

    RT-Thread操作系統從開機到關機的操作過程是怎樣的?

    RT-Thread操作系統從開機到關機的操作過程是怎樣的?
    發表于 02-15 07:43

    無鉛焊接在操作過程中的常見問題

    無鉛焊接在操作過程中的常見問題目前,電子制造正處于從有鉛向無鉛焊接過渡的特殊階段,無論從環保、立法、市場競爭和產品可靠等方面來看,無鉛
    發表于 04-07 17:09 ?1073次閱讀

    心電監護儀操作過程

    心電監護儀是醫院實用的精密醫學儀器,能同時監護病人的動態心電圖形、呼吸、體溫、等生理參數。這里提供了心電監護儀操作過程使用維護。
    發表于 12-21 17:36 ?2.1w次閱讀
    心電監護儀<b class='flag-5'>操作過程</b>

    關于SMT貼片機操作過程中的注意事項

    SMT貼片機操作過程中的注意事項 SMT貼片機是SMT整線線最關鍵、最核心的設備,貼片機是否正常工作直接影響貼片廠的產線運轉情況,因此平時的生產過程中,必須要勤加保養,讓貼片機發揮
    發表于 07-07 15:11 ?4378次閱讀

    FPGA應用中部分重配置的操作過程

    Partial Reconfiguration(部分重配置)現在的FPGA應用中越來越常見,我們這次的教程以Project模式為例來說明部分重配置的操作過程
    的頭像 發表于 07-05 15:28 ?3708次閱讀
    FPGA應用中部分重配置的<b class='flag-5'>操作過程</b>

    在線快速修復終聚釜攪拌器軸磨損的現場操作過程

    在線快速修復終聚釜攪拌器軸磨損的現場操作過程
    發表于 12-06 15:17 ?5次下載

    磐石測控:深圳扭轉試驗機操作過程是什么樣的?

    磐石測控:深圳扭轉試驗機操作過程是什么樣的?
    的頭像 發表于 10-20 11:17 ?687次閱讀
    磐石測控:深圳扭轉試驗機<b class='flag-5'>操作過程</b>是什么樣的?
    主站蜘蛛池模板: 综合涩| 女69女人poren25| 天堂网中文字幕 | 国产叼嘿免费视频网站 | 天天操天天谢 | 日本美女中出 | 天天做天天爱天天做天天吃中 | 四虎永久网址 | 两性午夜欧美高清做性 | 亚欧毛片基地国产毛片基地 | 日本免费黄色片 | 韩国a级床戏大尺度在线观看 | 丝袜美腿一区 | 久久夜色精品国产亚洲 | 清冷双性被cao的合不拢腿 | 国模爱爱| 欧美 激情 在线 | 正在播放国产女免费 | 玖玖福利 | 色婷婷激婷婷深爱五月老司机 | 日韩精品一区二区三区毛片 | 免费看国产精品久久久久 | 欧美在线激情 | 日本国产视频 | 久久精品99| 亚洲91在线视频 | 天天曰夜夜操 | 男人午夜视频 | 久久看免费视频 | 男女交性视频免费播放视频 | 狠狠色丁香婷婷综合橹不卡 | 特级生活片 | 很黄很暴力 很污秽的小说 很黄很黄叫声床戏免费视频 | 国产小视频网站 | 色婷婷电影 | 久久精品国产大片免费观看 | 国产1区2区三区不卡 | 天天躁夜夜躁狠狠躁2021 | 国产无限资源 | 97久久天天综合色天天综合色hd | 国产午夜免费一区二区三区 |