首页 > 其他分享 >【暑假题目】20230712 帧处理

【暑假题目】20230712 帧处理

时间:2023-07-16 23:55:06浏览次数:33  
标签:题目 20230712 buffer receivedData start 暑假 end 接收 数据

帧处理

题目

在物联网应用中需要经常处理数据帧,请你写一段处理数据帧的代码将收到的数据进行解析输出
提示:
1、数据帧的长度不定,但是帧头帧尾是固定的
2、数据帧的参数数量不定,请注意
3、每次收到的数据可能不是完整的一帧,但是不能把不完整的数据帧丢弃,应该等待到下一完整帧接收到后才丢弃
4、一次可能接受到不止一个数据帧,可能是多个,需要针对不同数据帧进行分割
搜索关键词:数据帧粘包 数据帧拆包 帧处理

题目分析

(1)根据题目,我们得知帧头帧尾是固定的,处理接收数据时,只有接收到完整的帧才能丢弃,由于接收的不固定,所以需要对帧切割。

(2)根据关键词,我们搜索得到了粘包与拆包出现的情况:

 思路及其代码

思路一

1.使用容器存储我们所接收到的帧的数据。

2.用三种数据模拟我们接收到的三种帧:完整帧,不完整帧(拆包),包含多个数据帧的完整帧。

3.再使用一个缓冲变量存储还未处理的帧。

4.将接收到的数据放入到缓存变量中。

5.通过遍历不同的帧寻找固定不变的帧头与帧尾。

6.如果寻找的帧不是帧头与帧尾,则对该帧进行提取与处理后继续寻找帧头帧尾。

7.完成以上步骤后,输出处理后的帧。 

代码一

#include<iostream>
#include<string>
#include<vector>
using namespace std;

void ProcessDataFrame(const string& dataFrame)
{
    // 解析数据帧并输出
    // 这里只是简单地将数据帧输出到控制台
    cout << "Received DataFrame: " << dataFrame << endl;
}

int main()
{
    //模拟接收到的数据
    vector<string> receivedData;  // 存储接收到的数据

    // 模拟接收到的数据,包含完整和不完整的数据帧
    receivedData.push_back("LZ0041");  
    receivedData.push_back("19");
    receivedData.push_back("c10001");
    receivedData.push_back("1c0a87b0");
    receivedData.push_back("107");
    receivedData.push_back("fbC");

    // 数据缓冲变量,用于存储未处理的数据
    string buffer;

    for (const auto& data : receivedData)//进行遍历接收的数据
    {
        buffer += data;  // 将新接收的数据添加到缓冲中

        size_t start = buffer.find("LZ");  // 查找帧头的位置
        size_t end = buffer.find("C");  // 查找帧尾的位置

        while (start != string::npos && end != string::npos) //非帧头与帧尾的数据
        {
            if (end > start && end - start >= 2)
            {
                string dataFrame = buffer.substr(start, end - start + 1); // 提取数据帧
                ProcessDataFrame(dataFrame);  // 处理数据帧
            }

            buffer = buffer.substr(end - 1); // 删除已处理的数据帧

            start = buffer.find("LZ");  // 再次查找帧头的位置
            end = buffer.find("C");  // 再次查找帧尾的位置
        }
    }
}

 结果1:

 

标签:题目,20230712,buffer,receivedData,start,暑假,end,接收,数据
From: https://www.cnblogs.com/hcrzhi/p/17547605.html

相关文章

  • 暑假第一周总结
    周一:今天没有学习,在家玩了一天周二:今天看网课复习了一下python周三:今天进行python环境配置周四:今天玩了一天,没有学习。周五:今天进行数据库的连接。周六:今天继续连接数据库又看了一下爬虫的概念周日:今天玩了一天没有学习。......
  • 暑假训练2023.7.16
    CodeforcesRound882(Div.2)A.TheManwhobecameaGod分成若干段后,分割处的差分会丢失,因此要使所求的各段的差分和最小,只需要让丢失的差分尽可能大。求出序列差分,从大到小排序,去除前\(k-1\)个即可。B.HamonOdyssey首先一个数不断按位与其他数,结果是不增的,因此整个......
  • 暑假补题记 1
     题目意思就是:有n个任务,每一个任务都有K个小任务每一个小任务都有指定时间,之后做完一个大任务额外加一分,然后给你M分钟,问在M分钟里,你需要得到最多分是多少。题解:首先对K个小任务排个序,对n个大任务进行遍历,就是你做完一个大任务,其他的时间全部搞小任务,然后一个个n进行比较,看看做......
  • 暑假生活1
    放假第一周没放太多时间在学习上,稍微了解了一下大数据技术方面的知识,总结了一下这学期在知识层面的缺漏点。说实话有很多地方是不足的,可能是因为对浏览器等信息检索设备的利用率不够,加之我很难在对Javascript、CSS、HTML等语言了解不足的情况下实现简单的web界面的搭建以及对部......
  • 暑假第一周总结
    第一周主要学习了python还有hadoop的前期内容,还有Linux的基本命令,shell的基本命令python里面学习了python的注释方法,python里面的基本的三个函数input(),print(),type(),python的格式化输出。Hadoop里面学习了Hadoop是什么,Hadoop的基本概念,Hadoop里面的三大分类HDFS,YARN,MapReduce。安装了......
  • 近期 AtCoder Beginner Contest 题目选做
    AtCoderBeginnerContest310Ehttps://atcoder.jp/contests/abc310/tasks/abc310_e我们要求所有区间的NAND之和,发现NAND最后只可能是\(0\)或\(1\),所以我们只需要计数区间NAND为\(1\)的即可。考虑dp,设\(f_{i,0/1}\)表示以\(i\)结尾的区间最后NAND和为\(0/......
  • 7.15--暑假第一周总结
      这一周下载并配置好了VMWare虚拟机,Datagrip用于连接hive数据库,下载好了FinalShell用于便利LInux虚拟机指令操作。  学习完了Linux命令,看完了黑马程序员里关于Linux小白的全部内容,学习了大数据视频内容,一共88集目前已经看到52集,学习了mapreduce,yarn以及hive数据库的部分......
  • 高等数学暑假打卡行动 --【Day 1】-- 初等函数回顾+极限概念
    今日重点基本初等函数和初等函数区别基本初等函数包括:幂函数\(y=x^a\)、指数函数\(y=a^x\)、对数函数\(y=log_ax\)、三角函数\(y=sinx,y=cosx,y=secx,y=cscx\)和反三角函数\(y=arcsinx,y=arccosx,y=arctanx,y=arccotx\),多项式函数\(a_nx^n+a_{n-1}x^{n+1}+...+a_1x+......
  • 2023暑假集训杂题
    2023暑假集训杂题解题报告UOJNOIRound#7Day1那些你不要的题目链接题目描述给定长度为\(n\)的序列\(A\),保证\(n\)为奇数,你是先手,每次先手与后手分别取相邻的\(2\)个数,并将剩下的数合并。先手希望最后剩下的数最大,后手希望剩下的数最小,在最优策略下,最后剩下的数是多......
  • 2023-07-09~07-15第一周暑假生活
    本周平均学习时间应该是2小时每天,代码时间要短一点在1个小时的样子,解决问题总时长估计是三个小时学习内容和代码内容大部分是js的知识,也有在学习Linux的操作和搭载大数据环境。下周计划重心仍然是放在熟练掌握javaweb目标上——继续学习练习HTML、学习Springboot。下个月再把......