【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;//转float
    bool 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 server
        std::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 location
 void 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 8080

int 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回调函数的处理请求,并构建响应
运行服务端和客户端:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OS进程取样器OS Process Sampler执行CMD/Shell命令

Apache JMeter - Users Manual: Component Reference 1.背景 项目上最近需要测试一种很少用到的DICOM协议,但是网上资料很少,基本上可以总结为三种方案: 直接发送TCP 16进制数据包,但是参数化数据准备难度大通过开发封装jar包发送,需要开发组提供通过发送cmd命令给前置机…

ES升级--05--快照生成 和备份

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 备份ES数据1.关闭集群自动均衡2.执行同步刷新3.停止集群节点的Elasticsearch服务4.修改Elasticsearch配置文件&#xff0c;开启快照功能&#xff0c;配置仓库目录为…

java:FeignClient通过RequestInterceptor自动添加header

示例代码 【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.12.RELEASE</version> </dependency> <dependency><groupId>o…

f-stack和DPDK

GPT-4 (OpenAI) f-stack和DPDK&#xff08;数据平面开发套件&#xff09;都是与高性能网络处理相关的技术。它们的目的是提高数据包的处理速度&#xff0c;优化网络I/O的性能。以下是对这两者的简要解释&#xff1a; 1. **DPDK (Data Plane Development Kit):** DPDK 是一个…

柯桥成人外语培训|职场商务英语剑桥国际英语口语外贸商务英语

01 “puppy love”是什么意思&#xff1f; 大家都知道&#xff0c;puppy有“幼犬&#xff0c;小狗”的意思&#xff0c;love是“爱”&#xff0c;那puppy love是什么意思呢&#xff1f;可不是字面上表达的小狗的爱哦&#xff01; 其实&#xff0c;"puppy love"真正的…

轻松实现App推广代理结算,Xinstall超级渠道功能助您一臂之力!

在App推广的广阔天地中&#xff0c;与渠道方建立合作关系&#xff0c;共同实现用户增长和品牌提升&#xff0c;已成为众多开发者和广告主的共识。然而&#xff0c;如何高效管理这些渠道、监测推广效果、实现代理结算&#xff0c;一直是困扰大家的难题。今天&#xff0c;我们就来…

P4. 微服务: 匹配系统(上)

P4. 微服务: 匹配系统 上 Tips0 概述1 匹配系统流程2 游戏系统流程3 websocket 前后端通信的基础配置3.1 websocket 的需要的配置3.2 websocket 连接的建立3.3 为 websocket 连接添加 jwt 验证 4 实现匹配界面和对战界面的切换5 匹配系统的客户端和 websocket 后端交互部分5.1 …

Spark的开发环境配置

1. 介绍 这里主要记录一下&#xff0c;我们常用的maven配置&#xff0c;方便后期开发配置环境&#xff0c;避免每次都从零开始配置工程。 2. 工程目录 3. pom的配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven…

Leetcode学习

回文数 反转一半数字 第一个想法是将数字转换为字符串&#xff0c;并检查字符串是否为回文。 但是&#xff0c;这需要额外的非常量空间来创建问题描述中所不允许的字符串。 第二个想法是将数字本身反转&#xff0c;然后将反转的数字与原始数字比较&#xff0c;如果它们是相同…

【课程总结】Day6(下):机器学习项目实战–成人收入预测

机器学习项目实战&#xff1a;成人收入预测 项目目的 基于个人收入数据(包括教育程度、年龄、性别等)的数据集&#xff0c;通过机器学习算法&#xff0c;预测一个人的年收入是否超过5万美金。 数据集 地址&#xff1a;http://idatascience.cn/dataset-detail?table_id10036…

HJS-DE1/3断电延时时间继电器 导轨安装 约瑟JOSEF

​HJS-DE断电延时时间继电器 HJS-DE1/3断电延时时间继电器 HJS-DE1/2断电延时时间继电器 HJS-DE断电延时时间继电器 用途 时间继电器HJS-DE1/3作为通电立即动作断电延时返回的元件&#xff0c;用于交流或直流保护和自动控制装置中&#xff0c;使被控元件得到所需延时。本继电…

MySQL系列-语法说明以及基本操作(一)

1、前言 主要讲解MySQL的基本语法 官网文档 https://docs.oracle.com/en-us/iaas/mysql-database/doc/getting-started.html 关于MySQL的基本语法&#xff0c;关于数据类型、表的操作、数据操作、事务、备份等&#xff0c;可参考 http://www.voidme.com/mysql 2、数据类型 数…

【PX4-AutoPilot教程-TIPS】离线安装Flight Review PX4日志分析工具

离线安装Flight Review PX4日志分析工具 安装方法 安装方法 使用Flight Review在线分析日志&#xff0c;有时会因为网络原因无法使用。 使用离线安装的方式使用Flight Review&#xff0c;可以在无需网络的情况下使用Flight Review网页。 安装环境依赖。 sudo apt-get insta…

在客户自己的smarteye server上如何测试使用公网对讲PoC集群通话功能

创建用户对讲群组&#xff0c;可以在WEB调度台上操作&#xff0c;也可以在执法记录仪或者手机上操作&#xff0c;当然&#xff0c;前提是当前登录的用户有创建集群通话对讲组的权限&#xff0c;一般的推荐用管理员帐号去创建这些对讲组&#xff0c;这样最简单。 总体说明 用管…

echarts的toolbox自定义feature标签及事件

1. 需求 在使用echarts图时希望toolbox扩展一些自定义icon和点击事件&#xff0c;而不只是图中这些echarts提供的事件。 2. 文档 属性名类型描述toolbox.featureObject各工具配置项。 feature中除了echarts提供的各个内置的工具按钮外&#xff0c;可以自定义工具按钮。 除…

经典文献阅读之--FlashOcc(快速且内存高效的占用预测模块)

Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务&#xff0c;并且需要GPU资源&#xff0c;可以考虑使用UCloud云计算旗下的Compshare的GPU算力云平台。他们提供高性价比的4090 GPU&#xff0c;按时收费每卡2.6元&#xff0c;月卡只需要1.7元每小时&…

windows下编译linux的go程序报错gcc_linux_amd64.c: In function ‘_cgo_sys_thread_start‘:

报错解决 执行报错 报错解决 其他补充 windows下编译linux 64位程序 set GOARCHamd64 set GOOSlinux set CGO_ENABLED0 go build手把手教你实现Golang跨平台编译 报错解决其他补充windows下编译linux 64位程序Windows下编译Mac平台64位可执行程序&#xff1a;Linux 下编译…

webpack--压缩,代码的拆分,tree shinking

Terser 对代码进行压缩、丑化 const TerserPlugin require("terser-webpack-plugin");optimization: { minimize: true, //在开发环境下启用 CSS 优化minimizer: [new TerserPlugin({extractComments: false,terserOptions: {compress: {arguments: true,// 将函数…

Cursor是什么?基于ChatGPT代码编辑器的cursor如何使用?VS Code如何迁移到Cursor的步骤

Cursor是什么 Cursor 是一个基于 Visual Studio Code&#xff08;VS Code&#xff09;技术构建的高级代码编辑器&#xff0c;专为提高编程效率并更深度地整合 AI 功能而设计。它不仅继承了 VS Code 的强大功能和用户界面&#xff0c;还增加了专门针对 AI 支持的特色功能。 Cur…

UE5 渲染性能优化 学习笔记

主要考虑三个点&#xff1a; 1、灯光 2、半透明物体 3、后处理 1、Game&#xff1a;CPU对游戏代码的处理工作 2、Draw&#xff1a;CPU为GPU准备数据所做的工作 3、GPU Time&#xff1a;就是GPU所渲染需要花的时间 UE5的命令行指令 里面说明了某个指令有什么用处 以及启动…