【云备份】第三方库的认识与使用

news2024/11/15 5:06:35

文章目录

  • json库
    • 粗略认识
    • 详细认识
      • writer 类
      • reader类
      • jsoncpp序列化实现
      • jsoncpp反序列化实现
  • bundle文件压缩库
    • 简单认识
    • bundle库实现文件压缩
    • bundle库实现文件解压缩
  • httplib库
    • Request类
    • Response类
    • Server类
    • Client类

json库

粗略认识

json是一种数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据


姓名是char类型、年龄是 int类型、 成绩是 float类型
json将多种数据类型对象 组织成为一个字符串

json数据类型:对象、数组、字符串、数字
对象:使用 {} 括起来的表示一个对象
如:小明 和小黑 两个 学生信息对象

数组:使用 [] 括起来的表示一个数组
如:小明和小黑的成绩都有三个数,用[] 括起来 表示一个数组

字符串:使用" "括起来的表示一个字符串
如:小明和小黑的名字 使用双引号,表示字符串

数字:包括整形和浮点型 直接使用
如:小明和小黑的年龄 可以直接 填入 即可


详细认识

jsoncpp库 用于实现 json格式 的序列化和反序列化,完成将多个数据对象组织成为 json格式字符串
以及将json格式字符串 解析得到多个数据对象的功能

主要借助三个类以及对应的成员函数完成:

该类中重载了 [] 和 = 两个运算符
好处是 进行数据存储时,json::value类会保存所有的数据对象

也可以用 asString 寻找对应数据中属于string的部分
asInt 寻找对应数据中属于int的部分


writer 类

将json::value 对象中所保存的多个数据对象的数据 进行序列化

json_api writer json_api fastwriter 、 json_api styledwriter 作为低版本
使用低版本,可能会报警告


json_api streamwriter json_api streanwriterbuilder 作为高版本
使用高版本,则不会有警告


无论低版本还是高版本 都有 write 这个成员函数
传递一个 json::value的数据对象,将这个对象中的所有的数据 按照 json格式 进行序列化
若为低版本,则直接返回一个 json数据串
若为高版本,则 将json 数据串 放入 流中


reader类

实现 json的反序列化
即 将json格式的字符串 反序列化 解析得到多个数据对象,放入 json::value 对象中


反序列化的低版本 为 json_api reader
使用其中的 parse接口, 第一个参数 decument 作用为 json格式的字符串 传入
第二个参数root 作用为 将反序列化得到的对象存放到 root中


反序列化的高版本 共有两种 charreadercharreaderbuilder

先通过 charreaderbuilder 类中的 newcharreader接口 实例化一个 charreader 对象
再去通过 调用charreader 类中的 parse 接口
第一个参数为 字符串的起始地址 第二个参数为字符串的结束地址
第三个参数为 json::value对象的指针
将字符串内容进行反序列化 放入 root中
若解析出错,则会把错误信息 放入 第四个参数 errs中


jsoncpp序列化实现

假设有以上信息
1.需要先将数据保存到 json::value 对象中


2.想要使用 json::StreamWriter 进行序列化 ,就需要先借助 json::StreamWriterBuilder 实例化一个 StreamWriter对象
然后再使用 StreamWriter类中的 write接口 ,将数据串 放入流中


将上述信息放入主函数main中


在实例化一个 json::value类型的root对象,将上面的的数据保存到root中
因为 json::value 重载了运算符,所以基础数据是可以直接通过赋值来完成的


实例化一个 StreamWriterBuilder类型的对象 swb
再通过类中的newStreamWriter接口 实例化一个StreamWriter对象被命名为 sw


定义一个 stringstream 流 ss
在借助StreamWriter类中的 write接口,将root中的数据串 传入 流中
最后打印流中的数据



输入 g++ json_example.cpp -o json_example -ljsoncpp
再次执行程序 , 将数据串 显示到流中


jsoncpp反序列化实现

string str= “{“姓名”:“小黑”,“年龄”:19,“成绩”:[58.5,66,35.5]}”;
{外的双引号 与 {内的双引号 有歧义 ,就需要用 \ 进行转义 ,表示用的是 原始的双引号


string str=R"({“姓名”:“小黑”,“年龄”:19,“成绩”:[58.5,66,35.5]})“;
若想简单写,则可以使用C++11中的特殊用法 R”( )" 表示括号内部都是原始字符串,所有的字符都已经去除了特殊含义


jsoncpp中进行反序列化 ,是将字符串中的数据解析放到了 Json::Value 中
1.定义一个Json::Value对象 root


2. 想要使用 CharReader 进行反序列化 ,则需要先通过 CharReaderBuilder 实例化一个对象 CharReader
在调用 CharReader 的 parse接口


创建一个str字符串,并且内部都是原始字符串


创建一个 json::value 类型的root对象
实例化一个 json::CharReader类型的对象 crb
再通过类中的 newCharReader接口 实例化一个CharReader 对象被命名为 cr


若ret为false,则说明反序列化失败
若ret为true, 则说明反序列化成功

root[“姓名”].asString() 表示 获取到 姓名对应数据中的string数据
所以使用 asString 表示 获取对应的string数据

root[“年龄”].asInt() 表示 获取到 年龄对应数据中的int数据
所以使用 asInt 表示 获取对应的int数据


反序列化后,数据全部放入root中,最终 将root对象中的数据全部打印出来


bundle文件压缩库

简单认识

bundleBundle 是一个嵌入式压缩库,使用时只需要加入两个文件 bundle.h 和 bundle.cpp 即可


bundle库实现文件压缩

由于在之前已经安装过了 bundle库,所以直接使用 bundle-master

bundle-master 中的 bundle.cpp bundle.h 拷贝出来 当到当前目录中


从运行参数中获取到文件压缩的文件名和压缩包名称
打开原文件,读取对应的数据,再对其进行压缩

共有三个参数,文件压缩 文件名和压缩包名称
如果agv小于3,则表示参数个数不够,则直接返回-1


iffilename表示文件名称
offilename表示压缩包的名称


使用ifstream文件流 创建变量ifs
open打开原始文件,打开的是输入文件
输入 ios::binary i以二进制形式打开文件
iseekg i 作用为跳转到读写位置到末尾


获取末尾偏移量 即文件长度


跳转到文件起始位置


创建一个字符串 body
调整body大小为文件大小
读取文件所有数据到 body中


选择 LZIP 压缩格式,body作为文件内容,使用 pack 进行压缩,返回值就是压缩之后的数据


以输出文件流 ofstream 创建变量 ofs
以二进制的方式打开压缩包 文件
将压缩后的数据写入 压缩包文件中



执行compress可执行程序 即可运行出来


bundle.cpp文件大小为5.4M
通过compress 将其 进行压缩成 bundle.cpp.lz
再次查看发现bundle.cpp.lz大小为668K


bundle库实现文件解压缩

将文件压缩后的 bundle.cpp.lz 进行解压 , 再将解压的文件与 bundle.cpp进行对比


共有三个参数,文件压缩 压缩包名称和文件名称
如果agv小于3,则表示参数个数不够,则直接返回-1


以 istream文件流 创建变量 ifs
将filename文件 以二进制形式打开
使用 seekg 使 ifs 处于文件末尾
再通过 tellg 获取文件大小
最终通过 beg 跳转到 ifs文件的起始位置


创建一个字符串 body
调整body大小为文件大小
读取ifs文件所有数据到 body中


通过 bundle 库中的 unpack 进行解压缩


以 输出文件流ofstram 创建变量 ofs
以二进制形式,将ofilename文件打开
将解压缩后的数据 全部放入 ofs文件 中



httplib库

httplib库 是一个c++11单文件头的跨平台 HTTP/HTTPS库
只需包含 httplib.h 在代码中即可

实际用于搭建一个简单的http服务器或者客户端的库,这种第三方库免去搭建服务器或客户端的时间,提高开发效率


Request类

HTTP
首行: 请求方法 URL 协议版本
头部:key 与value 形成的KV模型
空行:\r\n
正文:提交给服务器的数据

请求方法中包含 GET获取资源 以及 POST提交表单数据


Request结构体的作用:
1.客户端保存的所有http请求相关信息,最终组织http请求发送给服务器
2.服务器收到http请求之后进行解析,将解析的数据保存在request结构体中,等待后续处理


MultipartFormDataMap 内部包含四个字段
name为字段名称
content为文件内容
filename为文件名称
coneent_type 为正文类型


has_header 查询头部字段
get_heaer_value 获取头部字段的值
set_header 设置头部字段的值
has_file 是否包含某个文件
get_file_value 获取文件信息


Response类

HTTP响应格式
首行:协议版本 响应状态码 状态码描述
头部:响应的关键性描述字段 key: value\r\n key:value\r\n
空行: \r\n
正文:响应给客户端的数据


Response结构体功能
用户将响应数据放到结构体中,httplib会将其中的数据按照http响应格式 组织成为http


Server类

Server功能
用于搭建http服务器


listen作为搭建服务器并启动http服务器


handler是一个函数指针类型的业务处理函数,定义了一个http请求处理回调函数格式
第一个参数 request 为 保存请求数据,让用户能够根据请求数据进行业务处理
第二个参数 response 为 用户在业务处理中,填充数据,最终要响应给客户端

http搭建的服务器收到请求后,进行解析,得到一个Request结构体,其中包含请求数据
根据请求数据 就可以将请求处理,处理函数定义的格式为Handler格式


Handlers是 请求与处理函数映射表
为一个请求路由数组,数组中包含两个信息
regex 为 正则表达式 用于匹配 http请求资源路径
Handler 为 请求处理函数指针
可以将 Handlers 看作一张表 映射了客户端请求的资源路径和一个处理函数(用户自己定义的函数)

当服务器收到请求解析得到 Request 就会根据 资源路径以及请求方法到这张表中查看有没有对应的处理函数
如果有则调用这个函数进行请求处理
如果没有则响应404


new_task_queue 作为一个线程池 用于处理请求
httplib 会收到一个新建 连接,则将新的客户端连接抛入 线程池中

线程池中线程的工作:
1.接收请求,解析请求,得到request结构体 即请求数据
2.在Handlers映射表中,根据请求信息 查找处理函数,如果有则调用函数处理,如果没有则响应404
3.当处理函数调用完毕后,根据函数返回的response结构体中的数据 组织 http响应 发送给客户端


Client类

Client类 用于搭建 http的客户端


GET 向服务器发送GET请求
传入的是 请求的资源路径和 头部字段

第一个POST 发送post请求
path为资源路径、body作为正文数据、length作为正文长度、content_type 作为 正文类型

第二个POST POST请求提交多区域数据 常用于多文件上传
path为资源路径
MultipartFormDataItems 是一个数组,而items 为上传的文件信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1243820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos 7 安装yum(针对python卸载yum出错)

提前下载所需安装包,按照下面顺序安装即可完成,每个依赖包必须正确安装 下载地址:http://mirrors.163.com/centos/7/os/x86_64/Packages/ rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps ##强制删除已安装程序及其关联 whereis …

lazada商品详情数据接口(lazada.item_get)

Lazada商品详情数据接口是Lazada电商平台提供的一个API接口,用于获取商品详细信息。通过这个接口,开发者可以获取Lazada平台上商品的丰富信息,包括商品名称、价格、库存、描述、图片等。这个接口使用RESTful风格,并通过HTTP协议进…

解决:前端js下载文件流出现“未知文件格式”错误

第一中情况: 出现的问题,前端已经设置了responseType: blob,下载下来还是格式不对。 最后经过排查,后端缺少charsetutf-8,所以前端可以设置编码: 第二中情况: 后端已经设置了charsetutf-8,前…

Splunk Enterprise大数据分析平台+内网穿透实现远程访问

文章目录 前言1. 搭建Splunk Enterprise2. windows 安装 cpolar3. 创建Splunk Enterprise公网访问地址4. 远程访问Splunk Enterprise服务5. 固定远程地址 前言 Splunk Enterprise是一个强大的机器数据管理平台,可帮助客户分析和搜索数据,以及可视化数据…

【MISRA-C 2012】浓缩版解读

文章目录 1、前言2、简介2.1、如何看待MISRA-C 20122.2、准则(guidelines)里面的指示(Directive)和规则(Rule)2.3、准则(guidelines)的级别(Category) 3、若干重要的Directive和Rule3.1、指示(Directive)Dir 2.1(必要) 所有的源文件编译过程不得有编译错…

如何通过宝塔面板搭建一个本地MySQL数据库服务并实现远程访问

宝塔安装MySQL数据库,并内网穿透实现公网远程访问 文章目录 宝塔安装MySQL数据库,并内网穿透实现公网远程访问前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网…

猫罐头选哪个牌子?口碑好的5款猫罐头推荐给新手养猫人!

很多人家里的哈基米是不是吃猫粮吃腻了,或者猫猫平时不喜欢喝水,又或者看猫猫太瘦了想入手几款猫罐头但是又愁于不会选择。而且现在猫罐头风这么大不知道选什么好~ 作为一个从事宠物行业7年的宠物店店长,看到很多新手羊毛人来店里咨询怎么给猫…

QMI8658A(6轴)-EVB 评估板-使用说明书

QMI8658A6<6轴>-EVB 评估板-使用说明书 0.前言 1.硬件准备 1.1 I2C 接口 1.2 USART 接口 1.3 引脚序号功能定义 2.程序运行 0.前言 【相关博文】 【QMI8658 - 姿态传感器学习笔记 - Ⅰ】 【QMI8658 - 姿态传感器学习笔记 - Ⅱ】 【QMI8658 - 姿态传感器学习…

CAN基础知识

CAN 简介 CAN 是 Controller Area Network 的缩写&#xff08;以下称为 CAN&#xff09;&#xff0c;是 ISO 国际标准化的串行通信 协议。在当前的汽车产业中&#xff0c;出于对安全性、舒适性、方便性、低公害、低成本的要求&#xff0c;各种 各样的电子控制系统被开发了出来…

vscode在运行c语言时,无法scanf输入

问题&#xff1a; 在学习c语言中&#xff0c;我在使用scanf和cin时无法在终端进行输入(运行了但是无法输入)&#xff0c;在网上寻找答案&#xff0c;并写下笔记 解决方法 选择左上角 文件->首选项&#xff08;preferences&#xff09;->设置&#xff08;settings&#xf…

二十三、RestClient操作索引库

目录 例&#xff1a;利用JavaRestClient实现创建、删除索引库&#xff0c;判断索引库是否存在 1、编写mapping映射 2、初始化JavaRestClient &#xff08;1&#xff09;导入elasticsearch的依赖 &#xff08;2&#xff09;修改elasticsearch的版本 &#xff08;3&#xf…

Sublime Text 3运行 Python文件出现中文打印乱码的解决方式

很多小伙伴在下载安装好sublime这个编辑器后发现&#xff0c;它虽然能够用来打开python脚本和创建文件编写代码&#xff0c;但是却不能够来运行python代码和程序。所以下面这一篇文章就是会来分享一下&#xff0c;sublime编辑器无法运行python的解决方法&#xff0c;感兴趣的话…

Unity调用dll踩坑记

请用写一段代码&#xff0c;让unity无声无息的崩溃。 你说这怕是有点难哦&#xff0c;谁会这么不幸呢&#xff1f;不幸的是&#xff0c;我幸运的成为了那个不幸的人。 unity里面调用dll的方式是使用 DllImport &#xff0c;比如有一个 Hello.dll&#xff0c;里面有一个 char* …

TSINGSEE青犀智能分析网关道路积水识别AI算法方案

在各处的街道、路口等区域&#xff0c;及时发现道路积水问题&#xff0c;可以大大减少城市管理部门压力&#xff0c;及时处理&#xff0c;减少交通事故与人员摔倒事故。通过道路积水AI算法&#xff0c;能有效提高城市管理部门效率&#xff0c;优化城市管理方式。 那么&#xff…

做流体分析需要知道的两大核心问题:内流和外流

SOLIDWORKS Flow Simulation 是直观的流体力学 (CFD) 分析软件&#xff0c;可以快速轻松的分析产品内部或外部流体的流动情况&#xff0c;以用来改善产品性能和功能。SOLIDWORKS Flow Simulation将专业的流体分析进行功能优化&#xff0c;让普通机械设计师也能进行流体力学分析…

MG-HSF

作者未提供代码

Vivado Modelsim联合进行UVM仿真指南

打开Vivado&#xff0c;打开对应工程&#xff0c;点击左侧Flow Navigator-->PROJECT MANAGER-->Settings&#xff0c;打开设置面板。点击Project Settings-->Simulation选项卡&#xff0c;如下图所示。 将Target simulator设为Modelsim Simulator。 在下方的Compil…

Kibana安装部署

目录 一、环境准备 二、安装部署 2.1 下载安装包到指定文件夹&#xff0c;并解压 2.2 重置kibana_system密码 2.3 编辑启动文件 2.3 进入界面 三、使用 3.1 创建视图 3.2 视图优化 一、环境准备 部署模式&#xff1a;单节点部署。 官网地址&#xff1a;Elasticsearch 平…

【JavaSE】不允许你不会使用String类

&#x1f3a5; 个人主页&#xff1a;深鱼~&#x1f525;收录专栏&#xff1a;JavaSE&#x1f304;欢迎 &#x1f44d;点赞✍评论⭐收藏 目录 前言&#xff1a; 一、常用方法 1.1 字符串构造 1.2 String对象的比较 &#xff08;1&#xff09;比较是否引用同一个对象 注意…

C#中的迭代器和分部类

目录 一、迭代器 1.示例源码 2.生成效果&#xff1a; 二、分部类 1.示例源码 2.生成效果 迭代器在集合类中经常使用&#xff0c;而分部类则提供了一种将一个类分成多个类的方法&#xff0c;这对于有大量代码的类非常实用。 一、迭代器 迭代器是可以返回相同类型的值的有…