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

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

文章目录

  • 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 为上传的文件信息

相关文章:

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

文章目录 json库粗略认识详细认识writer 类reader类jsoncpp序列化实现jsoncpp反序列化实现 bundle文件压缩库简单认识bundle库实现文件压缩bundle库实现文件解压缩 httplib库Request类Response类Server类Client类 json库 粗略认识 json是一种数据交换格式,采用完全…...

6.2.SDP协议

那今天呢?我们来介绍一下sdp协议,那实际上呢?sdp协议非常的简单。我们如果拿到一个stp的文档去看的话,那你要分阅里边的所有的内容会觉得很枯燥,但实际上呢,如果我们按照这张图所展示的结构去看stp的话。你…...

[汇编实操]DOSBox工具安装——Ubuntu18.04系统

一、下载&安装 sudo apt install -y dosbox 二、启动 dosbox 三、C盘挂载 将上述文件下载放在任意路径,将DEBUG目录映射为虚拟C盘 MASM.EXE 是用来编译的,LINK.EXE 用来链接,这俩是必须的。 执行如下命令: mount c /m…...

前端 HTML 的 DOM 事件相关知识有哪些?

HTML 的 DOM 事件是指在网页上发生的各种事件,如点击、鼠标移动、键盘输入等。 通过 JavaScript 脚本可以对这些事件进行监听和处理,以实现交互效果。以下是一些常见的 DOM 事件及其相关知识点: 1、click:点击事件,在…...

Mac自带的看图如何连续查看多张图片

一、问题 mac看访达里的图片时,双击打开一张图片,然后按上下左右键都没法切换到另外的图片。而且也没找到像window一样单击缩略图可以看到预览图。其实是自己不懂得怎么使用,哈哈哈😂 二、方法 2.1、图标方式 可以看到缩略图&a…...

HTTP四大参数类型及请求参数的方式和如何接收

HTTP 请求中4大参数类型和接收方法。 1、请求头参数head 请求头参数顾名思义,是存放在请求头中发送给服务器的参数,服务器通过解析请求头获取参数内容。通常会存放本次请求的基本设置,以帮助服务器理解并解析本次请求的body体。 参数形式如…...

【C++11】default、delete与Noncopyable

C11 oop中的default、delete与Noncopyable default 在C11标准中,可以使用default关键字来显式地声明默认的构造函数和析构函数。 使用default关键字可以用来显式声明默认的构造函数和析构函数。这样做可以让编译器自动生成默认实现 –>->->关于构造函数…...

【心得】基于flask的SSTI个人笔记

目录 计算PIN码 例题1 SSTI的引用链 例题2 SSTI利用条件: 渲染字符串可控,也就说模板的内容可控 我们通过模板 语法 {{ xxx }}相当于变相的执行了服务器上的python代码 利用render_template_string函数参数可控,或者部分可控 render_…...

ubuntu20.04 nginx 部署静态网页

1、安装nginx Ubuntu环境下安装部署Nginx(有网)_ubuntu 安装nginx_荒Huang的博客-CSDN博客 2、压缩并上传文件到服务器指定位置(unzip命令),修改nginx配置文件,指定root目录为文件的目录,index 值为指定的html文件 …...

vue脚手架的基础搭建过程

MVVM架构 Vue框架底层设计遵循MVVM架构。 Model层(M)模型层(业务逻辑层) View层(V)视图层 主管UI ViewModel层(VM) 将项目代码划分清晰的层次结构后,非常有利于后期代…...

函数与数组

一.函数 1、函数的作用 定义较为复杂的但是需要重复使用的内容,以便再次使用,可以直接调用,节约时间,提高效率。 语句块定义成函数约等于别名,定义函数,再引用函数。 封装的可重复利用的具有特定功能的…...

2023年【安全生产监管人员】考试题及安全生产监管人员找解析

题库来源:安全生产模拟考试一点通公众号小程序 安全生产监管人员考试题参考答案及安全生产监管人员考试试题解析是安全生产模拟考试一点通题库老师及安全生产监管人员操作证已考过的学员汇总,相对有效帮助安全生产监管人员找解析学员顺利通过考试。 1、…...

K8S(一)

一、kubernetes 概述 1、kubernetes 基本介绍 kubernetes,简称 K8s,是用 8 代替 8 个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的 应用简单并且高效…...

Linux快速显示文件行号并跳转

有时候,想要在线上直接查看日志文件,搜索到关键词后,如果一直按n找下去,很麻烦,我们可以先显示出行号,确定好我们要找内容对应的行号,直接跳转过去。 esc进入命令模式,输入:set nu命…...

异步爬取+多线程+redis构建一个运转丝滑且免费http-ip代理池 (二)

继上一章: CSDN 本次需要做的是进行有效ip的验证! 我们知道,从网页上爬取上千上万个ip之后,因为是免费的代理,所以,对这上千上万个ip进行验证有效性就需要考虑效率上的问题了; 而验证ip有效性的唯一办法,就是通过对网络发起请求;如果state200,就是有效,否则就是无效; 而上…...

HugeGraph安装与使用

1、HugeGraph-Server与HugeGraph-Hubble下载 HugeGraph官方地址:https://hugegraph.apache.org/ 环境为:linux 官网是有模块版本对应关系,尽量下载较新版本,hubble1.5.0之前是studio功能比较少。官网已经下架server,其他模块下载也比较慢。可以在网上找…...

计算机端口

前言 计算机端口(Port)是一种用于在计算机网络中标识特定服务或应用程序的机制。 端口是一个数字,范围从0到65535,用于将网络通信分配给不同的应用程序或服务。 在 Internet 协议套件(TCP/IP)中&#xff0…...

激发创新,助力研究:CogVLM,强大且开源的视觉语言模型亮相

项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域):汇总有意义的项目设计集合,助力新人快速实…...

centos 6.10 安装 perl 5.14

下载安装包 运行下面命令: wget http://www.cpan.org/src/5.0/perl-5.14.2.tar.gz也可以直接下载好安装包,再拷到虚拟机 安装 执行下面命令 tar -xvzf perl-5.14.2.tar.gz #解压安装包 cd perl-5.14.2 ./Configure -des -Dprefix/usr/local/perl ma…...

Elasticsearch:FMA 风格的向量相似度计算

作者:Chris Hegarty 在 Lucene 9.7.0 中,我们添加了利用 SIMD 指令执行向量相似性计算的数据并行化的支持。 现在,我们通过使用融合乘加 (Fused Mulitply-Add - FMA) 进一步推动这一点。 什么是 FMA 乘法和加法是一种常见的运算,…...

人类思想史上的一些思维模型整理

LLM 本质上是在做条件概率的接龙:根据你已经写下的每一个 token,去推断下一个最可能的分布。 你用的词、句式、段落节奏、甚至隐含的思维路径,都在不断收窄模型的“接下来该怎么说”的可能性空间。 所以,和 AI 对话时,…...

给数字IC新人的UPF避坑指南:电源开关、隔离单元和电平移位器到底怎么配?

给数字IC新人的UPF避坑实战:电源管理三大核心模块的配置陷阱与调试技巧 低功耗设计已经成为现代数字IC开发中不可回避的挑战。当你第一次在项目中独立编写UPF(Unified Power Format)脚本时,那种既兴奋又忐忑的心情我深有体会——电…...

题解:洛谷 B2142 求 1+2+3+...+N 的值

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大家订阅我的专栏:算法…...

深入探讨:解决Codeium Chat在Android Studio中的集成问题

前言 在现代软件开发中,集成开发环境(IDE)已成为开发人员必不可少的工具。Android Studio,作为Android开发的首选IDE,提供了丰富的功能来提高开发效率。然而,近期有用户反映在Android Studio中使用Codeium Chat时遇到了问题。本文将深入探讨这一问题,分析原因并提供可能…...

基于MITRE ATTCK的AI代理安全评估框架与实践

1. 计算机使用代理安全评估框架解析在当今企业IT环境中,计算机使用代理(Computer-Using Agents, CUAs)作为AI代理技术的重要实现形式,正逐渐渗透到系统管理、自动化运维等关键领域。然而,这些具备自主决策能力的代理程序,其安全性…...

(课堂笔记)Oracle 聚合函数与 GROUP BY 分组查询

本文总结了Oracle中聚合函数与GROUP BY分组查询的核心知识点。主要内容包括:1)常用聚合函数(SUM/MAX/MIN/AVG/COUNT)的使用及NULL值处理;2)GROUP BY语法结构和分组查询示例;3)HAVING…...

云原生环境中的容器安全最佳实践:从镜像到运行时的全方位防护

云原生环境中的容器安全最佳实践:从镜像到运行时的全方位防护 🔥 硬核开场 各位技术大佬们,今天咱们来聊聊容器安全。别跟我说你的容器就随便拉个镜像跑,那是在玩火!在云原生时代,容器安全是底线&#xff0…...

百度Agent岗一面:你知道哪些更复杂的 RAG 范式?

👔面试官:你了解哪些更复杂的 RAG 范式?除了最基本的检索加生成,还有什么更高级的玩法? 🙋‍♂️我:呃,我觉得 Advanced RAG 就是最复杂的了吧,加个 Rerank 和 Query 改…...

大模型训练全链路指南:从经典架构到AI自进化,每个环节的核心逻辑与避坑指南

本文深入浅出地拆解了大模型端到端训练的完整闭环,涵盖了预训练、中期训练、多阶段后训练以及验证与部署适配四个核心阶段。文章详细阐述了每个环节的核心目标、适用场景、抉择逻辑与避坑红线,旨在为个人开发者、中小企业和大厂研发团队提供有益的参考。…...

英语单词发音MP3音频批量下载方案:构建海量语音库的技术实现

英语单词发音MP3音频批量下载方案:构建海量语音库的技术实现 【免费下载链接】English-words-pronunciation-mp3-audio-download Download the pronunciation mp3 audio for 119,376 unique English words/terms 项目地址: https://gitcode.com/gh_mirrors/en/Eng…...