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

news2024/11/27 16:50:57

文章目录

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

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

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

相关文章

西门子step7脉冲方波

西门子300/400PLC程序可以使用系统时钟脉冲来完成一些定时任务&#xff0c;节省自己写Timer定时器。 定时器字节位定义 默认定义的MB1&#xff0c;则M1.5是1秒定时脉冲方波。 案例 快闪&#xff0c;慢闪。 报警器一闪一闪用。 1分钟计时及1分钟一个脉冲 30分钟计时及30分…

OpenHarmony napi 编译 .so 并打包成 .har

一、前言 最近在搞公司标准产品适配OpenHarmony 平台&#xff0c; 按照行业上的常用方法&#xff0c;在Android 是将底层代码用c 封装成 xxx.so &#xff0c;然后将其他一部分打包成 xxx.jar。 因此&#xff0c;在OpenHarmony 平台也是打算按照这个模式。正所谓&#xff0c;好…

10 设备树

掌握设备树是 Linux 驱动开发人员必备的技能! 1、什么是设备树 新版本 Linux 中,ARM 相关的驱动全部采用了设备树。Linux-4.1.15 支持设备树。我们了解一下设备树的起源、重点学习一下设备树语法。 设备树:Device Tree,就是“设备”和“树”,描述设备树的文件叫做 DTS(…

[数据集][图像分类]黑色素瘤分类数据集10015张7类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;10015 分类类别数&#xff1a;7 类别名称:[“0”,“1”,“2”,“3”,“4”,…

【LeetCode:312. 戳气球+ 动态规划】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【JMeter接口测试工具】第一节.JMeter简介和安装【入门篇】

文章目录 前言一、JMeter简介 1.1 JMeter基本介绍 1.2 JMeter优缺点二、JMeter安装 2.1 JMeter安装步骤 2.2 JMeter环境配置三、项目介绍 3.1 项目简介 3.2 API接口清单总结 前言 一、JMeter简介 1.1 JMeter基本介绍 JMeter 是 Apache 组织使用…

30分钟吃掉 Pytorch 转 onnx

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

论文浅尝 | THINK-ON-GRAPH:基于知识图谱的深层次且可靠的大语言模型推理方法...

笔记整理&#xff1a;刘佳俊&#xff0c;东南大学硕士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://arxiv.org/pdf/2307.07697.pdf 1. 动机 本文是IDEA研究院的工作&#xff0c;这篇工作将知识图谱的和大语言模型推理进行了结合&#xff0c;在每一步图推理中利用大…

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:电力巡检智能机器人

聚焦数字经济与双碳经济赛道&#xff0c;专注于提供集中式新能源场站与分布式综合能源数智化整体解决方案&#xff0c;坚持以场站数字化、综合能源数字化双轮驱动发展。依靠专业化人才队伍与丰富的实证基地研究经验&#xff0c;打造成熟、先进的数智新能源研发平台。 在集中式新…

【Git】远程操作 -- 详解

一、理解分布式版本控制系统 我们目前所说的所有内容&#xff08;工作区、暂存区、版本库等等&#xff09;都是在本地&#xff0c;也就是在我们的笔记本或者计算机上。而我们的 Git 其实是分布式版本控制系统。 上面这段话是什么意思呢&#xff1f; 可以简单理解为&#xff1…

模型 SCAMPER创新法则

说明&#xff1a;系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。激发创新的七步思维法。 1 SCAMPER创新法则的应用 1.1 SCAMPER应用之改进自行车设计 一家自行车制造商希望改进其自行车设计&#xff0c;以吸引更多的消费者并提高市场份额。他们决…

【小白专用24.6.8】C# 异步任务Task和异步方法async/await详解

一、什么是异步 同步和异步主要用于修饰方法。当一个方法被调用时&#xff0c;调用者需要等待该方法执行完毕并返回才能继续执行&#xff0c;我们称这个方法是同步方法&#xff1b;当一个方法被调用时立即返回&#xff0c;并获取一个线程执行该方法内部的业务&#xff0c;调用…

最值,反转数组——跟之前的差不多

文章目录 数组最值感悟改进 反转数组问题 代码改进 数组最值 package com.zhang; /*求数组最大最小值*/ public class test_arr1 {public static void main(String[] args) {int[] arr {10,66,42,8,999,1};max(arr);min(arr);}public static int max(int[] arr){int max arr…

【云原生_K8S系列】Kubernetes 控制器之 Deployment

在 Kubernetes 中&#xff0c;Deployment 是一种高级控制器&#xff0c;负责管理应用的部署和生命周期。它提供了一种声明性的方式来定义应用的期望状态&#xff0c;并确保实际状态与期望状态保持一致。Deployment 可以自动处理应用的滚动更新、扩展和回滚等任务&#xff0c;是…

GPU风扇不旋转:为什么会发生这种情况以及如何修复

GPU在处理数百万像素时往往会发热,因此冷却风扇静音可能会令人担忧,这是可以理解的!如果你注意到你的GPU风扇没有旋转,下面是如何评估是否存在真正的问题,以及如何解决问题。 风扇停止旋转可能是一个功能,而不是一个Bug 如果GPU没有用于密集任务或没有达到高温,则可以…

Java 环境配置 -- Java 语言的安装、配置、编译与运行

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 002 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

vs - vs2015编译gtest-v1.12.1

文章目录 vs - vs2015编译gtest-v1.12.1概述点评笔记将工程迁出到本地后&#xff0c;如果已经编译过工程&#xff0c;将工程Revert, Clean up 干净。编译用的CMake, 优先用VS2019自带的打开VS2015X64本地命令行编译gtest工程测试安装自己写个测试工程&#xff0c;看看编译出来的…

《精通ChatGPT:从入门到大师的Prompt指南》第10章:案例分析

第10章&#xff1a;案例分析 10.1 优秀Prompt案例解析 在深入探讨如何精通ChatGPT的使用之前&#xff0c;理解并分析一些优秀的Prompt案例是至关重要的。这不仅有助于更好地掌握Prompt的构建技巧&#xff0c;还能提高与AI交互的效果。在这一节中&#xff0c;我们将详细解析一…

STM32F103C8T6 HAL库 printf重定向 USART1 DMA方式发送数据

前言&#xff1a; 在上一篇文章里&#xff0c;我采用printf重定向为usart1&#xff0c;但是这样发送&#xff0c;对于MPU的负载比较大&#xff0c;所以本篇文章采用DMA方式&#xff0c;解放MPU资源&#xff0c;去做其他的事情&#xff0c;这里仅做为自己的记录。 正文开始&…

LDA初步了解

LDA简析 最明显的特征是能够将若干文档自动编码分类为一定数量的主题&#xff08;注意&#xff1a;主题的数量需要人为指定&#xff09;。设定好主题数量之后&#xff0c;运行LDA模型就会得到每个主题下边词语的发布概率以及文档对应的主题概率。 LDA原理 LDA的工作原理 可把…