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;cnt< sizeof(sPack);cnt++)
    {
        printf("0x%02X  ",*(SendBuff + cnt)) ;
        RevBuff[cnt] = *(SendBuff + cnt);  //这里模拟接受到数据 
    } 

     printf("

");
    //模拟解包 
     pstRevPack = (sPack *)RevBuff;
     printf("pstRevPack.Head    = 0x%X
",pstRevPack->Head);
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

    文章

    7598

    浏览量

    136169
  • uart通信
    +关注

    关注

    0

    文章

    19

    浏览量

    6999

原文标题:结构体嵌入共联体在协议解析中的技术性操作~

文章出处:【微信号:嵌入式情报局,微信公众号:嵌入式情报局】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    手动移液器的使用操作过程

    手动移液器的使用操作过程  手动移液器常见于临床试验和实验室试验,不同类型的移液器操作过程也有所不同,下面具体的解析一下。  一、使用方法:  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 1059次阅读

    心电监护仪操作过程

    心电监护仪是医院实用的精密医学仪器,能同时监护病人的动态心电图形、呼吸、体温、等生理参数。这里提供了心电监护仪操作过程使用维护。
    发表于 12-21 17:36 2.1w次阅读
    心电监护仪<b class='flag-5'>操作过程</b>

    关于SMT贴片机操作过程中的注意事项

    SMT贴片机操作过程中的注意事项 SMT贴片机是SMT整线线最关键、最核心的设备,贴片机是否正常工作直接影响贴片厂的产线运转情况,因此平时的生产过程中,必须要勤加保养,让贴片机发挥
    发表于 07-07 15:11 4317次阅读

    FPGA应用中部分重配置的操作过程

    Partial Reconfiguration(部分重配置)现在的FPGA应用中越来越常见,我们这次的教程以Project模式为例来说明部分重配置的操作过程
    的头像 发表于 07-05 15:28 3622次阅读
    FPGA应用中部分重配置的<b class='flag-5'>操作过程</b>

    在线快速修复终聚釜搅拌器轴磨损的现场操作过程

    在线快速修复终聚釜搅拌器轴磨损的现场操作过程
    发表于 12-06 15:17 5次下载

    磐石测控:深圳扭转试验机操作过程是什么样的?

    磐石测控:深圳扭转试验机操作过程是什么样的?
    的头像 发表于 10-20 11:17 661次阅读
    磐石测控:深圳扭转试验机<b class='flag-5'>操作过程</b>是什么样的?