当前位置: 首页 > news >正文

自定义包的设计与实现

这是一个 CPacket 类,用于解析包含固定格式的数据。该类的成员变量包括固定包头 sHead、包长度 nLength、控制命令 sCmd、包数据 strData 和和校验 sSum。

构造函数:

CPacket():默认构造函数,初始化成员变量。

CPacket(const BYTE* pData, size_t& nSize):参数化构造函数,用于解析传入的数据(pData),并根据解析结果更新传入的数据大小nSize。如果解析成功,nSize 将被更新为实际有效数据的大小。

解析包数据:

通过循环遍历传入的数据,查找固定包头 0xFEFF 的位置。
如果找到包头,解析包的其他字段,包括包长度 nLength、控制命令 sCmd、包数据 strData 和和校验 sSum。
在解析过程中,对包数据的完整性进行了检查,确保包头和其他字段都能正确解析。
如果包的数据完全接收,并且和校验通过,更新传入的 nSize 为实际解析的包大小。

#pragma pack(push)
#pragma pack(1)
class CPacket
{
public:CPacket() :sHead(0),nLength(0),sCmd(0),sSum(0) {}// 复制构造函数CPacket(const CPacket& pack) {sHead = pack.sHead;nLength = pack.nLength;sCmd = pack.sCmd;strData = pack.strData;sSum = pack.sSum;}// 运算符重载CPacket& operator=(const CPacket& pack) {if (this != &pack) {sHead = pack.sHead;nLength = pack.nLength;sCmd = pack.sCmd;strData = pack.strData;sSum = pack.sSum;}return *this;}// 打包CPacket(WORD nCmd, const BYTE* pData, size_t nSize) {sHead = 0xFEFF;nLength = (DWORD)nSize + sizeof(WORD) * 2;sCmd = nCmd;if (nSize > 0) {strData.resize(nSize);memcpy((void*)strData.c_str(), pData, nSize);}else {strData.clear();}sSum = 0;for (size_t j = 0; j < strData.size(); j++){sSum += BYTE(strData[j]) & 0xff;}}// 解析包数据CPacket(const BYTE* pData, size_t& nSize) {size_t i = 0;for (; i < nSize; i++) {if (*(WORD*)(pData + i) == 0xFEFF) {sHead = *(WORD*)(pData + i);i += sizeof(WORD);break;}}// 包数据可能不全,或者包头未能全部接受到if ((i + sizeof(DWORD) + sizeof(WORD) + sizeof(WORD)) > nSize) {nSize = 0;return;}nLength = *(DWORD*)(pData + i); i += sizeof(DWORD);// 包未完全接受,解析失败if (nLength + i > nSize) {nSize = 0;return;}sCmd = *(WORD*)(pData + i); i += sizeof(WORD);if (nLength > sizeof(WORD) * 2) {strData.resize(nLength - sizeof(WORD) * 2);memcpy((void*)strData.c_str(), pData + i, nLength - sizeof(WORD) * 2);i += nLength - sizeof(WORD) * 2;}sSum = *(WORD*)(pData + i);i += 2;WORD sum = 0;for (size_t j = 0; j < strData.size(); j++) {sum += BYTE(strData[j]) & 0xff;}if (sum == sSum) {nSize = i;return;}nSize = 0;//解析失败}int Size() {//包数据大小return nLength + sizeof(WORD) + sizeof(DWORD);}const char* Data() {//获取包数据strOut.resize(Size());BYTE* pData = (BYTE*)strOut.c_str();*(WORD*)pData = sHead;pData += 2;*(DWORD*)pData = nLength;pData += 4;*(WORD*)pData = sCmd;pData += 2;memcpy(pData, strData.c_str(), strData.size());pData += strData.size();*(WORD*)pData = sSum;return strOut.c_str();}~CPacket() {}
public:WORD sHead;//固定包头 0xFEFFDWORD nLength;//包长度(控制命令到和校验)WORD sCmd;//控制命令std::string strData;//包数据WORD sSum;//和校验std::string strOut;//整个包的数据
};
#pragma pack(pop)

相关文章:

自定义包的设计与实现

这是一个 CPacket 类&#xff0c;用于解析包含固定格式的数据。该类的成员变量包括固定包头 sHead、包长度 nLength、控制命令 sCmd、包数据 strData 和和校验 sSum。 构造函数&#xff1a; CPacket()&#xff1a;默认构造函数&#xff0c;初始化成员变量。 CPacket(const B…...

时机成熟了

时机成熟了。 有一个老乡群&#xff0c;一到年底就各种人找车、车找人的消息。这些消息如果能直接爬取到一个小的网页里面去&#xff0c;则可以极大地便利大家做检索。如何把非结构化的内容转成结构化的 json&#xff0c;在以前是一个难题&#xff0c;但是有了 ChatGPT&#x…...

Linux 驱动开发基础知识——总线设备驱动模型(八)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…...

SpringBoot+BCrypt算法加密

BCrypt是一种密码哈希函数&#xff0c;BCrypt算法使用“盐”来加密密码&#xff0c;这是一种随机生成的字符串&#xff0c;可以在密码加密过程中使用&#xff0c;以确保每次加密结果都不同。盐的使用增强了安全性&#xff0c;因为攻击者需要花费更多的时间来破解密码。 下图为…...

更新至2023年,2002-2023年3月中国国债发行数据

更新至2023年&#xff0c;2002-2023年3月中国国债发行数据 1、时间&#xff1a;2002-2023年3月 2、指标&#xff1a;序号、代码、发行日期、发行总额(亿元)、期限(年)、发行价格、票面利率(发行参考利率)(%)、票面利率说明、息票品种、附息利率类型、付息频率、起息日期、付息…...

2024最新版TypeScript安装使用指南

2024最新版TypeScript安装使用指南 Installation and Development Guide to the Latest TypeScript in 2024 By JacksonML 1. 什么是TypeScript? TypeScript is JavaScript with syntax for types. – typescriptlang.org TypeScript 是 JavaScript 的一个超集&#xff0c;…...

国外知名的农业机器人公司

从高科技温室到云播种&#xff0c;农业机器人如何帮助农民填补劳动力短缺以及超市货架的短缺。 概要 “高科技农业”并不矛盾。当代农业经营更像是硅谷&#xff0c;而不是美国哥特式&#xff0c;拥有控制灌溉的应用程序、驾驶拖拉机的 GPS 系统和监控牲畜的带有 RFID 芯片的耳…...

【EI会议征稿中|ACM出版】#先投稿,先送审#第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)​

#先投稿&#xff0c;先送审#ACM出版#第三届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2024&#xff09; 2024 3rd International Conference on Cyber Security, Artificial Intelligence and Digital Economy 2024年3月8日-10日 | 中国济南 会议官网&…...

【笔试常见易错选择题01】else、表达式、二维数组、%m.ns、%m.nf、常量指针和指针常量、宏定义、传参、数组越界、位段

1. 下列main()函数执行后的结果为&#xff08;&#xff09; int func(){ int i, j, k 0; for(i 0, j -1;j 0;i, j){ k; } return k; } int main(){cout << (func());return 0; }A. -1 B. 0 C. 1 D. 2 判断为赋值语句&#xff0c;j等于0 0为假不进循环 选B. 2. 下面程…...

Unity中常见的单词

前言 unity中常见的单词学习积累 一.常用的基础词。 new:新建; as:像。。一样; null:对象空值; void:函数返回空值; switch:开关; abstract:抽象的; event:事件&#xff1b; return:返回; class:类; …...

【仅需一步,1分钟极速开服】幻兽帕鲁保姆级教程

本教程分为两部分。一、开服教程。二、如何登录游戏&#xff08;第一次接触游戏&#xff0c;如何玩&#xff09; 一、开服教程。 1、通过 游戏服务器专属优惠页&#xff0c;选择以下应用模板并点击立即购买。 - 【服务器套餐配置推荐】* 1、入门配置&#xff08;2&#xff5e;…...

Zoho Mail 2023:回顾过去,展望未来:不断进化的企业级邮箱解决方案

当我们告别又一个非凡的一年时&#xff0c;我们想回顾一下Zoho Mail如何融合传统与创新。我们迎来了成立15周年&#xff0c;这是一个由客户、合作伙伴和我们的敬业团队共同庆祝的里程碑。与我们一起回顾这段旅程&#xff0c;探索定义Zoho Mail历史篇章的敏捷性、精确性和创新性…...

python执行linux系统命令的三种方式

前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 1. 使用os.system 无法获取命令执行后的返回信息 import osos.system(ls)2. 使用os.popen 能够获取命令执行后的返回信息 impor…...

协会认证!百望云荣获信创工委会年度“卓越贡献成员单位”称号

当前&#xff0c;新一轮科技革命和产业变革正加速重塑全球经济结构&#xff0c;强化企业科技创新的主体地位&#xff0c;推动创新链、产业链、人才链深度融合&#xff0c;加快科技成果产业化进程至关重要。 近日&#xff0c;中国电子工业标准化技术协会信息技术应用创新工作委员…...

神经网络激活函数到底是什么?

激活函数 其实不是很难啦&#xff0c;归结一下就是大概这样几个分类&#xff0c;详情请参考【神经网络】大白话直观理解&#xff01;_哔哩哔哩_bilibili神经网络就是干这个事的~ 如果队伍不长&#xff0c;一个ykxb就可以了&#xff0c;如果 如果 队伍太长 就加一个激活函数也…...

【智慧工业】东胜物联定位与跟踪解决方案,为方案商提供蓝牙网关、信标等物联网智能硬件设备

利用东胜物联的蓝牙网关我们的合作伙伴在德国的建筑工地成功实施了基于物联网蓝牙的员工出勤和跟踪管理解决方案&#xff0c;该解决方案简化了员工时间表并增强了工作流程&#xff0c;为经理和主管提供了更多时间来专注于项目洞察&#xff0c;并提高了员工的效率、绩效和生产力…...

C#中使用OpenCvSharp4库读取本地图像并显示

C#中使用OpenCvSharp4库读取本地图像并显示 OpenCvSharp4是基于.NET 的 OpenCV 包装器&#xff0c;OpenCV源代码是采用C和C写的&#xff0c;目前对于C和Python开发者相对来说比较友好&#xff0c;对于Python开发者而言官方提供了opencv-python使用。 首选我们使用Visual Studi…...

Stable Diffusion系列(四):提示词规则与使用

文章目录 基础规则高级规则插件使用基于相机镜头增强提示词常用提示词总结奇特提示词珍藏 基础规则 所谓提示词&#xff0c;也就是文生图中的文&#xff0c;由连贯的英语单词或句子组成。其最基础的规则是&#xff1a; 不同提示词之间需要用英文逗号分隔&#xff0c;空格和换…...

vue3动态循环引入本地静态图片资源

解决方法一 根据官网的提示&#xff0c;我找到了最简单的方法&#xff0c;就是在将asset 前面加上src。 解决方法二 关于第二个方法&#xff0c;官网说&#xff1a;“实际上&#xff0c;Vite 并不需要在开发阶段处理这些代码&#xff01;在生产构建时&#xff0c;Vite 才会进行…...

k8s从私有库harbor中拉取镜像

目录 一、前言 二、配置 三、问题总结 一、前言 Docker镜像是构建应用程序的基础。然而&#xff0c;许多组织和开发团队希望保留他们的Docker镜像在私有仓库中&#xff0c;并从中拉取镜像&#xff0c;而不是从公共Docker Hub中下载。这样做的原因有很多&#xff0c;包括&…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

41道Django高频题整理(附答案背诵版)

解释一下 Django 和 Tornado 的关系&#xff1f; Django和Tornado都是Python的web框架&#xff0c;但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架&#xff0c;鼓励快速开发和干净、实用的设计。它遵循MVC设计&#xff0c;并强调代码复用。Django有…...

CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)

漏洞概述 漏洞名称&#xff1a;Apache Kafka Connect JNDI注入导致的远程代码执行漏洞 CVE编号&#xff1a;CVE-2023-25194 CVSS评分&#xff1a;8.8 影响版本&#xff1a;Apache Kafka 2.3.0 - 3.3.2 修复版本&#xff1a;≥ 3.4.0 漏洞类型&#xff1a;反序列化导致的远程代…...

本地部署drawDB结合内网穿透技术实现数据库远程管控方案

文章目录 前言1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 前言 在数字化浪潮席卷全球的背景下&#xff0c;数据治理能力正日益成为构建现代企业核心竞争力的关键因素。无论是全球500强企业的数据中枢系统&#xff0c;还是初创…...

uni-app学习笔记二十三--交互反馈showToast用法

showToast部分文档位于uniapp官网-->API-->界面&#xff1a;uni.showToast(OBJECT) | uni-app官网 uni.showToast(OBJECT) 用于显示消息提示框 OBJECT参数说明 参数类型必填说明平台差异说明titleString是提示的内容&#xff0c;长度与 icon 取值有关。iconString否图…...

20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决

20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决 2025/6/7 17:20 缘起&#xff1a; 1、根据RK809的DATASHEET&#xff0c;短按开机【100ms/500ms】/长按关机&#xff0c;长按关机。6s/8s/10s 我在网上找到的DATASHE…...

操作系统期末版

文章目录 概论处理机管理进程线程处理机调度生产者消费者问题 死锁简介死锁的四个必要条件解决死锁的方法 存储管理链接的三种方式静态链接装入时动态链接运行时链接 装入内存的三种方式绝对装入可重定位装入动态运行时装入 覆盖交换存储管理方式连续分配**分段存储管理方式***…...