【lesson1】第三方库(jsoncpp,bundle, httplib)的介绍和使用

文章目录

  • jsoncpp库
    • json 认识
    • jsoncpp 认识
    • jsoncpp 实现序列化
    • jsoncpp 实现反序列化
  • bundle库
    • bundle库实现文件压缩
    • bundle库实现文件解压缩
  • httplib 库
    • httplib 库搭建简单服务器
    • httplib库搭建简单客户端

jsoncpp库

json 认识

json 是一种数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。
例如:
在这里插入图片描述
json 数据类型:对象,数组,字符串,数字
对象:使用花括号 {} 括起来的表示一个对象。
数组:使用中括号 [] 括起来的表示一个数组。
字符串:使用常规双引号 “” 括起来的表示一个字符串
数字:包括整形和浮点型,直接使用

jsoncpp 认识

//Json数据对象类
class Json::Value{Value &operator=(const Value &other); //Value重载了[]和=,因此所有的赋值和获取数据都可以通过Value& operator[](const std::string& key);//简单的方式完成 val["姓名"] = "小明";Value& operator[](const char* key);Value removeMember(const char* key);//移除元素const Value& operator[](ArrayIndex index) const; //val["成绩"][0]Value& append(const Value& value);//添加数组元素val["成绩"].append(88); ArrayIndex size() const;//获取数组元素个数 val["成绩"].size();std::string asString() const;//转string string name = val["name"].asString();const char* asCString() const;//转char*   char *name = val["name"].asCString();Int asInt() const;//转int int age = val["age"].asInt();float asFloat() const;//转floatbool asBool() const;//转 bool
};//json序列化类,低版本用这个更简单
class JSON_API Writer {virtual std::string write(const Value& root) = 0;
}
class JSON_API FastWriter : public Writer {virtual std::string write(const Value& root);
}
class JSON_API StyledWriter : public Writer {virtual std::string write(const Value& root);
}
//json序列化类,高版本推荐,如果用低版本的接口可能会有警告
class JSON_API StreamWriter {virtual int write(Value const& root, std::ostream* sout) = 0;
}
class JSON_API StreamWriterBuilder : public StreamWriter::Factory {virtual StreamWriter* newStreamWriter() const;
}//json反序列化类,低版本用起来更简单
class JSON_API Reader {bool parse(const std::string& document, Value& root, bool collectComments = true);
}
//json反序列化类,高版本更推荐
class JSON_API CharReader {virtual bool parse(char const* beginDoc, char const* endDoc, Value* root, std::string* errs) = 0;
}
class JSON_API CharReaderBuilder : public CharReader::Factory {virtual CharReader* newCharReader() const;

jsoncpp 实现序列化

在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述

jsoncpp 实现反序列化

在这里插入图片描述
运行结果:
在这里插入图片描述
我们都知道在初学c++和c的时候总是要在输出时输出类似于"\" ,‘%’ ,’ " ’等等一系列符号。我们常用的方法是在输出里面用上双斜杠,或者说是双%%,那么我们到底还有没有其他的方法呢?
所以今天我们要介绍的就是我们的主角R了;
在c++中我们可以使用以R"+(为开头,并且以)+"为结尾来输出我们想要的任何语句,包括%和\。

bundle库

BundleBundle 是一个嵌入式压缩库,支持23种压缩算法和2种存档格式。使用的时候只需要加入两个文件bundle.h 和 bundle.cpp 即可。

namespace bundle
{// low level API (raw pointers)bool is_packed( *ptr, len );bool is_unpacked( *ptr, len );unsigned type_of( *ptr, len );size_t len( *ptr, len );size_t zlen( *ptr, len );const void *zptr( *ptr, len );bool pack( unsigned Q, *in, len, *out, &zlen );bool unpack( unsigned Q, *in, len, *out, &zlen );// medium level API, templates (in-place)bool is_packed( T );bool is_unpacked( T );unsigned type_of( T );size_t len( T );size_t zlen( T );const void *zptr( T );bool unpack( T &, T );bool pack( unsigned Q, T &, T );// high level API, templates (copy)T pack( unsigned Q, T );T unpack( T );
}

bundle库实现文件压缩

#include <iostream>
#include <string>
#include <fstream>
#include "bundle.h"int main(int argc, char* argv[])
{if(argc != 3){std::cout << argv[0]<< " sourceFileName compressedFileName" << std::endl;exit(0);}std::string ifilename = argv[1];std::string ofilename = argv[2];std::ifstream ifs;ifs.open(ifilename, std::ios::binary);ifs.seekg(0, std::ios::end);//跳转到文件末尾size_t fsize = ifs.tellg();//从头到末尾的字节大小ifs.seekg(0, std::ios::beg);//回到文件头部std::string buffer;buffer.resize(fsize);ifs.read(&buffer[0], buffer.size());std::string paked = bundle::pack(bundle::LZIP, buffer);std::ofstream ofs;ofs.open(ofilename, std::ios::binary);ofs.write(&paked[0], paked.size());ifs.close();ofs.close();return 0;
}

生成可执行程序:
在这里插入图片描述
运行可执行程序
./bundle + 要压缩的文件名 + 压缩后的文件名.lz
在这里插入图片描述

bundle库实现文件解压缩

#include <iostream>
#include <string>
#include <fstream>
#include "bundle.h"int main(int argc, char* argv[])
{if(argc != 3){std::cout << argv[0]<< " compressedFileName sourceFileName" << std::endl;exit(0);}std::string ifilename = argv[1];std::string ofilename = argv[2];std::ifstream ifs;ifs.open(ifilename, std::ios::binary);ifs.seekg(0, std::ios::end);size_t fszie = ifs.tellg();ifs.seekg(0, std::ios::beg);std::string buffer;buffer.resize(fszie);ifs.read(&buffer[0], buffer.size());std::string unpaked = bundle::unpack(buffer);std::ofstream ofs;ofs.open(ofilename, std::ios::binary);ofs.write(&unpaked[0], unpaked.size());ifs.close();ofs.close();return 0;
}

生成可执行程序:
在这里插入图片描述

运行结果:
./bundle + 要解压缩的文件 + 解压后的文件名
在这里插入图片描述

httplib 库

httplib 库,一个 C++11 单文件头的跨平台HTTP/HTTPS库。安装起来非常容易。只需包含 httplib.h 在你的代码中即可。
httplib 库实际上是用于搭建一个简单的 http 服务器或者客户端的库,这种第三方网络库,可以让我们免去搭建服务器或客户端的时间,把更多的精力投入到具体的业务处理中,提高开发效率。

namespace httplib{struct MultipartFormData {std::string name;std::string content;std::string filename;std::string content_type;};using MultipartFormDataItems = std::vector<MultipartFormData>;//请求类struct Request {std::string method;std::string path;Headers headers;std::string body;// for serverstd::string version;Params params;MultipartFormDataMap files;Ranges ranges;bool has_header(const char *key) const;std::string get_header_value(const char *key, size_t id = 0) const;void set_header(const char *key, const char *val);bool has_file(const char *key) const;MultipartFormData get_file_value(const char *key) const;};//响应类struct Response {std::string version;int status = -1;std::string reason;Headers headers;std::string body;std::string location; // Redirect locationvoid set_header(const char *key, const char *val);void set_content(const std::string &s, const char *content_type);};//服务端类,可用于搭建服务端class Server {using Handler = std::function<void(const Request &, Response &)>;using Handlers = std::vector<std::pair<std::regex, Handler>>;std::function<TaskQueue *(void)> new_task_queue;Server &Get(const std::string &pattern, Handler handler);Server &Post(const std::string &pattern, Handler handler);Server &Put(const std::string &pattern, Handler handler);Server &Patch(const std::string &pattern, Handler handler);  Server &Delete(const std::string &pattern, Handler handler);Server &Options(const std::string &pattern, Handler handler);bool listen(const char *host, int port, int socket_flags = 0);};//客户端搭建类,可用于搭建客户端class Client {Client(const std::string &host, int port);Result Get(const char *path, const Headers &headers);Result Post(const char *path, const char *body, size_t content_length,const char *content_type);Result Post(const char *path, const MultipartFormDataItems &items);}
}

httplib 库搭建简单服务器

#include <iostream>
#include "httplib.h"//回调函数
void Hello(const httplib::Request &req, httplib::Response& rep)
{rep.set_content("Hello World", "text/plain");rep.status = 200;
}//回调函数
void Numbers(const httplib::Request &req, httplib::Response& rep)
{auto num = req.matches[1];rep.set_content(num, "text/plain");rep.status = 200;
}//回调函数
void Multipart(const httplib::Request &req, httplib::Response& rep)
{auto ret = req.has_file("file");if(ret == false){std::cout << "not file upload" << std::endl;rep.status = 404;return;}const auto& file = req.get_file_value("file");rep.body.clear();rep.body = file.filename;rep.body += "\n";rep.body += file.content;rep.set_header("Content-Type", "text/plain");rep.status = 200;}int main()
{httplib::Server srv;srv.Get("/hi", Hello);srv.Get(R"(/numbers/(\d+))", Numbers);///numbers/(\d+)正则表达式srv.Post("/multipart", Multipart);srv.listen("0.0.0.0", 8080);return 0;
}

运行服务端用浏览器访问
在这里插入图片描述
在这里插入图片描述

httplib库搭建简单客户端

#include <iostream>
#include "httplib.h"#define SEVERIP "154.8.198.250"
#define SERVERPORT 8080int main()
{httplib::Client client(SEVERIP, SERVERPORT);httplib::MultipartFormData item;item.name = "file";item.filename = "test.txt";item.content = "Hello World";item.content_type = "text/plain";httplib::MultipartFormDataItems items;items.push_back(item);auto ret = client.Post("/multipart", items);std::cout << ret->status << std::endl;std::cout << ret->body << std::endl;return 0;
}

客户端向服务器发送Post请求,服务器用srv.Post(“/multipart”, Multipart)中Multipart回调函数的处理请求,并构建响应
运行服务端和客户端:
在这里插入图片描述

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

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

相关文章

【Vscode配置java环境并配置stringboot】

1.VSCODE配置JAVA环境 参考这篇文章配置JAVA环境&#xff1a;连接 java版本&#xff0c;我是win11系统,我下载的JAVA安装版本是下面&#xff0c;是最新版的&#xff1a; 配置环境&#xff1a;步骤很简单&#xff0c;就是向系统环境变量中添加路径&#xff0c;参考上面文章中的…

(20)DAC接口--->(005)FPGA实现AD5601接口(五)

(005)FPGA实现AD5601接口(五) 1 目录 (a)FPGA简介 (b)IC简介 (c)Verilog简介 (d)FPGA实现AD5601接口(五) (e)结束 1 FPGA简介 (a)FPGA(Field Programmable Gate Array)是在PAL (可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展…

基于学习模型的可学习小波变换方法(Pytorch)

首先以图像编码为例进行说明。 图像编码是一个复杂的系统&#xff0c;通常包含多个模块&#xff0c;其中变换模块具有重要作用。小波变换在图像编码领域得到了广泛的应用&#xff0c;例如著名的JPEG 2000就是一种小波图像编码方法。然而&#xff0c;现阶段的小波图像编码方法与…

htb-window-1-legacy-smb

nmap smb-vuln-ms08-067 py文件测试失败 msf 漏洞定位 反弹 获取flag

【Oracle篇】rman全库异机恢复:从单机环境到RAC测试环境的转移(第五篇,总共八篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

一文学会Spring 实现事务,事务的隔离级别以及事务的传播机制

目录 一.Spring (Spring Boot) 实现事务 1.通过代码的方式手动实现事务 (手动档的车) 2.通过注解的方式实现声明式事务 (自动挡的车) 二.事务的4大特性(ACID) 三.事务的隔离级别 ①Mysql的事务隔离级别: ②Spring的事务隔离级别: 四.事务的传播机制 ①事务传播机制的概…

验证码案例

目录 前言 一、Hutool工具介绍 1.1 Maven 1.2 介绍 1.3 实现类 二、验证码案例 2.1 需求 2.2 约定前后端交互接口 2.2.1 需求分析 2.2.2 接口定义 2.3 后端生成验证码 2.4 前端接收验证码图片 2.5 后端校验验证码 2.6 前端校验验证码 2.7 后端完整代码 前言…

基于可解释性深度学习的马铃薯叶病害检测

数据集来自kaggle文章&#xff0c;代码较为简单。 import numpy as np # linear algebra import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)# Input data files are available in the read-only "../input/" directory # For example, runni…

快团团供货大团长如何查看帮卖团长的订单?

一、功能说明 可以看到团购中每个帮卖团长帮卖产生的订单 二、具体设置方法 1、小程序端如何操作&#xff1f; 在团购页面中&#xff0c;点击订单管理&#xff0c;在这里可以选择全部团长订单&#xff0c;我的团订单&#xff0c;和帮卖团长的帮卖订单。 2、PC端如何操作&am…

ssm616基于vue.js的购物商场的设计与实现+vue【已测试】

前言&#xff1a;&#x1f469;‍&#x1f4bb; 计算机行业的同仁们&#xff0c;大家好&#xff01;作为专注于Java领域多年的开发者&#xff0c;我非常理解实践案例的重要性。以下是一些我认为有助于提升你们技能的资源&#xff1a; &#x1f469;‍&#x1f4bb; SpringBoot…

几句话搞懂什么是docker image?它主要解决什么问题?他用什么技术实现的?

一、什么是docker image? 1、除去LinuxOS内核资源的用户空间的一组资源集合的快照。 2、使用laber区分版本。 3、使用仓库进行分发。 4、符合OCI标准的Runtime都可以运行docker image. 二、他主要解决什么问题&#xff1f; 1、最最重要的就是解决可移植性&#xff01;当你本地…

【基于C++与OpenCV实现魔方图像识别和还原算法】施工总览图

文章目录 主要效果展示思维导图魔方还原算法 本系列博客长期更新&#xff0c;分为两大部分 OpenCV实现魔方六面识别 C编写科先巴二阶段还原算法实现三阶魔方的还原 主要效果展示 摄像头识别六面 3D图像构建&#xff0c;提供还原公式 动画演示还原过程 思维导图 魔方还原算法 参…

达梦8 开启物理逻辑日志对系统的影响

物理逻辑日志&#xff0c;是按照特定的格式存储的服务器的逻辑操作&#xff0c;专门用于 DBMS_LOGMNR 包挖掘获取数据库系统的历史执行语句。当开启记录物理逻辑日志的功能时&#xff0c;这部分日志内 容会被存储在重做日志文件中。 要开启物理逻辑日志的功能&#xff0c;需要…

Anaconda3 使用sudo运行时找不到命令

前言 最近在跑AI&#xff0c;使用到了Anaconda&#xff0c;但是在使用sudo命令运行的时候会出现找不到命令的情况 我的Anaconda是在chen这个普通用户下安装的,系统是 ubuntu20.04.06 LTS chenchen:~$ sudo conda sudo: conda: command not found解决方法如下&#xff1a; 编…

社区物资交易互助平台的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;基础数据管理&#xff0c;论坛管理&#xff0c;公告信息管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;论坛&#xff0c;求助留言板&#xff0c;公…

SQL Chat:从SQL到SPEAKL的数据库操作新纪元

引言 SQL Chat是一款创新的、对话式的SQL客户端工具。 它采用自然语言处理技术&#xff0c;让你能够像与人交流一样&#xff0c;通过日常对话的形式对数据库执行查询、修改、创建及删除操作 极大地简化了数据库管理流程&#xff0c;提升了数据交互的直观性和效率。 在这个框…

【Vue 路由参数传递】

文章目录 一、使用 params 传递参数1. 基本路由格式2. 可选参数的使用代码示例 二、使用 query 传递参数1. 基本路由格式代码示例 总结 一、使用 params 传递参数 1. 基本路由格式 在Vue中&#xff0c;使用params传递参数是通过路由的动态片段来完成的。在路由配置中&#xf…

电机的速度和频率

电机的速度和频率通常通过以下几种方法来采集&#xff1a;1. 霍尔效应传感器&#xff1a;• 霍尔效应传感器可以检测磁场变化&#xff0c;当电机轴上安装有磁性标记物&#xff08;如磁钢&#xff09;时&#xff0c;每当磁钢经过传感器&#xff0c;就会产生一个脉冲。通过计数单…

反AI浪潮中的新机遇:Cara艺术社区异军突起

近日,一个名为Cara的艺术社区在网络上迅速走红,其独特的反AI定位吸引了大量创意人士。在AI技术日益普及的今天,Cara社区反其道而行之,致力于打造一个无AI侵害的创作和交流环境。这一创新模式不仅赢得了艺术家的青睐,也为国内创业者提供了新的思考角度。 一、精准定位,守…

描述Hibernate的映射文件和配置文件的作用

Hibernate的映射文件和配置文件在Hibernate框架中起着至关重要的作用&#xff0c;它们分别负责不同的配置和映射任务。以下是关于Hibernate映射文件和配置文件的具体作用描述&#xff1a; Hibernate映射文件&#xff08;hbm.xml&#xff09;的作用 定义对象与数据库表之间的映…