云备份——第三方库简单介绍并使用(上)

news2024/11/18 8:13:25

目录

一,Jsoncpp库序列化和反序列化

二,bundle文件压缩库

 2.1 文件压缩

2.2 文件解压


一,Jsoncpp库序列化和反序列化

首先我们需要先了解一下json是什么,json是一种数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。

char name = "小明";
int age = 18;
float score[3] = {88.5, 99, 58};
则json这种数据交换格式是将这多种数据对象组织成为一个字符串:
[
    {
        "姓名" : "小明",
        "年龄" : 18,
        "成绩" : [88.5, 99, 58]
    },
    {
        "姓名" : "小黑",
        "年龄" : 18,
        "成绩" : [88.5, 99, 58]
    }
]

json数据类型:对象,数组,字符串,数字

对象:使用花括号{}括起来的表示一个对象。

数组:使用中括号[]括起来的表示一个数组。

字符串:使用常规双引号""括起来的表示一个字符串

数字:包括整形和浮点型,直接使用。

 

而Jsoncpp库主要用于Json格式的序列化和反序列化,可以将多个数据对象组织成Json格式的字符串(序列化),也可以将Json格式的字符串解析获得多个数据对象(反序列化)

 这其中主要借助三个类以及其对应的少量成员函数完成:

//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;
}

接下来我们来举例使用一下:

#include <iostream>
#include <sstream>
#include <memory>
#include <jsoncpp/json/json.h>

int main()
{
    // 序列化
    const char *name1 = "张三";
    int age1 = 18;
    float grade1[3] = {77.1, 64.74, 56.11};
    Json::Value val;
    val["姓名"] = name1;
    val["年龄"] = age1;
    val["成绩"].append(grade1[0]);
    val["成绩"].append(grade1[1]);
    val["成绩"].append(grade1[2]);

    Json::StreamWriterBuilder swb;
    std::shared_ptr<Json::StreamWriter> writer_ptr(swb.newStreamWriter());
    std::ostringstream sst;
    writer_ptr->write(val, &sst);
    std::cout << sst.str() << std::endl;

    std::cout << "----------------------------------------------------" << std::endl;
    // 反序列化
    std::string str = R"({"姓名":"李四","年龄":24,"成绩":[71.1,60,50]})";

    Json::Value root;
    std::string err;
    Json::CharReaderBuilder crb;
    std::shared_ptr<Json::CharReader> read_ptr(crb.newCharReader());
    read_ptr->parse(str.c_str(), str.c_str() + str.size(), &root, &err);

    const char *name2 = root["姓名"].asCString();
    int age2 = root["年龄"].asInt();
    float grade2[3] = {0};
    grade2[0] = root["成绩"][0].asFloat();
    grade2[1] = root["成绩"][1].asFloat();
    grade2[2] = root["成绩"][2].asFloat();

    std::cout << "姓名:" << name2 << std::endl;
    std::cout << "年龄:" << age2 << std::endl;
    for (auto f : grade2)
    {
        std::cout << f << " ";
    }
    std::cout << std::endl;

    return 0;
}

二,bundle文件压缩库

BundleBundle是一个嵌入式压缩库,支持23种压缩算法和2种存档格式。使用的时候只需要加入两个文件bundle.hbundle.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 );
}

 2.1 文件压缩

#include <iostream>
#include <string>
#include <fstream>
#include "bundle.h"

int main(int argc, char *argv[])
{
    std::cout <<"argv[1] 是原始文件路径名称\n";
    std::cout <<"argv[2] 是压缩包名称\n";
    if (argc < 3) return -1;

    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 body;
    body.resize(fsize);//调整body大小为文件大小
    ifs.read(&body[0], fsize);//读取文件所有数据到body找给你

    std::string packed = bundle::pack(bundle::LZIP, body);//以lzip格式压缩文件数据

    std::ofstream ofs;
    ofs.open(ofilename, std::ios::binary);//打开压缩包文件
    ofs.write(&packed[0], packed.size());//将压缩后的数据写入压缩包文件

    ifs.close();
    ofs.close();
    return 0;
}

 

2.2 文件解压

#include <iostream>
#include <fstream>
#include <string>
#include "bundle.h"

int main(int argc, char *argv[])
{
    if (argc < 3) {
        printf("argv[1]是压缩包名称\n");
        printf("argv[2]是解压后的文件名称\n");
        return -1; 
    }   
    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 body;
    body.resize(fsize);
    ifs.read(&body[0], fsize);
    ifs.close();

    std::string unpacked = bundle::unpack(body);//对压缩包数据解压缩

    std::ofstream ofs;
    ofs.open(ofilename, std::ios::binary);
    ofs.write(&unpacked[0], unpacked.size());
    ofs.close();
    return 0;
}

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

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

相关文章

开学有哪些电容笔值得买?平价电容笔排行榜

苹果的原装Pencil&#xff0c;无疑是一款性能出色的电容笔&#xff0c;但它的价格也很高&#xff0c;如果不小心弄丢了或者弄坏了&#xff0c;那就太让人心痛。再说了&#xff0c;一支价值不菲的电容笔&#xff0c;要是不是用于专业绘画&#xff0c;实在是大材小用。不过&#…

01. 二进制原理

道家阴阳启发了莱布尼茨提出二进制&#xff01; 1. 为什么是二进制&#xff1f; 1.1 二进制与硬盘&#xff08;磁盘&#xff09; 硬盘也叫磁盘&#xff0c;它内部是排列整齐的一个个小磁体。 磁盘上面有“电刷”&#xff0c;磁盘可以转动&#xff0c;“电刷”也可以上下移动…

Python 带参数的装饰器

首先我们定义一个可以打印日志的装饰器&#xff1a; def log(func):def wrapper(*args, **kwargs):print(call %s(): % func.__name__)return func(*args, **kw)return wrapper它接受一个函数作为输入&#xff0c;再返回一个函数。我们使用一下这个装饰器 log def now():prin…

【esp32】解决以太网+mqtt堆栈溢出问题 报错 no mem for receive buffer

本文主要记录了 esp32 + 以太网 +mqtt 功能时遇到的堆栈溢出的情况,千里之堤毁于蚁穴,开发过程的不细心导致多付出了一天多的时间,记录于此,共勉 📋 个人简介 💖 作者简介:大家好,我是喜欢记录零碎知识点的小菜鸟。😎📝 个人主页:欢迎访问我的 Ethernet_Comm 博…

一文看懂DETR(二)

训练流程 1.输入图像经过CNN的backbone获得32倍下采样的深度特征&#xff1b; 2.将图片给拉直形成token&#xff0c;并添加位置编码送入encoder中&#xff1b; 3.将encoder的输出以及Object Query作为decoder的输入得到解码特征&#xff1b; 4.将解码后的特征传入FFN得到预测特…

Rethinking the Role of Demonstrations: What Makes In-Context LearningWork?

背景 这篇论文主要验证了prompt demos对模型的作用是什么&#xff0c;主要几个方面的影响&#xff1a; 1.prompt demo的input和label的映射关系对结果影响非常小&#xff0c;模型没有从mapping关系中学到太多信息。这是比较反直觉的 2.模型从input输入的数据空间和label输出的…

VR全景与家居行业碰撞在一起,会迸发怎样的火花?

元宇宙的热度一直在持续&#xff0c;由于前几年疫情反复&#xff0c;很多人只能居家办公&#xff0c;这也让很多线下实体行业非常难做&#xff0c;元宇宙的兴起可以带动线下行业把生意做起来&#xff0c;那么家居行业、元宇宙、VR全景这些元素碰撞在一起&#xff0c;会迸发出怎…

从Instagram到TikTok:利用社交媒体平台实现业务成功

自 2000年代初成立和随后兴起以来&#xff0c;社交媒体一直被大大小小的品牌用作高度针对性的营销工具&#xff0c;自 Facebook推出近二十年以来&#xff0c;这些网站继续彻底改变企业处理广告的方式。 在这篇博文中&#xff0c;我们将讨论订阅企业应该如何从整体上对待社交媒…

秋云qiun chart 使用echart配置格式化柱形图数据

dataLabel数据文字格式化 <!-- seriesTemplate是config-echarts.js中对应图表类型定义好的series模板 &#xff0c;如果每个series的formatter都不一样&#xff0c;则format需要定义在chartData.series中&#xff0c;不能使用seriesTemplate --> <!-- formatter…

Java 面试 - Redis

Redis Redis 是基于键值对的非关系型数据库。Redis 拥有string、hash、list、set、zset等多种数据结构, redis具有惊人的读写性能, 其优秀的持久化机制是的它在断电和机械故障时也不会发生数据丢失, 可以用于热点数据存放, 还提供了键过期、发布订阅、食物、流水线、LUA脚本等多…

在node项目中通过jsencrypt实现内容加密

上来肯定先引入第三方依赖 npm install jsencrypt然后 我们创建一个js文件 叫 rsaEncrypt.js 参考代码如下 import JSEncrypt from jsencrypt/bin/jsencrypt.min// 密钥对生成 http://web.chacuo.net/netrsakeypairconst publicKey MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANL378k…

echarts的click事件

目录 前言 一、click事件 前言 在使用echarts的过程中&#xff0c;最常用的则是不同系列所对应的click返回参数的不同 一、click事件 在以下图中&#xff0c;其实是两个不同系列的数据&#xff0c;一个是图中的钟表&#xff0c;一个是下面的图 const option {grid: {left: …

Visual Studio软件_MSC_VER值(MSVC编译器版本)的获取方法

本文介绍查看Visual Studio软件_MSC_VER值的方法。 _MSC_VER是微软公司推出的C/C 编译器——MSVC编译器的一个内置宏&#xff0c;其值表示当前Visual Studio软件中MSVC编译器的具体版本。不同的Visual Studio软件版本对应着不同的MSVC编译器版本——无论是不同发布年份的版本&…

RT-Thread程序内存分布

一般MCU包含的存储空间有&#xff1a;片内Flash与片内RAM&#xff0c;RAM相当于内存&#xff0c;Flash相当于硬盘。 编译器会将一个程序分类分为好几个部分&#xff0c;分别存储在MCU不同的存储区。 Keil工程在编译完之后&#xff0c;会有相应的程序占用的空间提示信息。 lin…

螺旋矩阵、旋转矩阵、矩阵Z字打印

螺旋矩阵 #include <iostream> #include <vector> void display(std::vector<std::vector<int>>&nums){for(int i 0; i < nums.size(); i){for(int j 0; j < nums[0].size(); j){std::cout<<nums[i][j]<< ;}std::cout<<…

【SpringSecurity】八、集成图片验证码

文章目录 1、生成图片验证码2、创建验证码过滤器3、将过滤器加入SpringSecurity过滤链4、修改登录页 SpringSecurity是通过过滤器链来完成的&#xff0c;接下来的验证码&#xff0c;可以尝试创建一个过滤器放到Security的过滤器链中&#xff0c;在自定义的过滤器中比较验证码。…

Linux系统下Web文件系统搭建

背景 为了方便和协作者共享文件和方便文件统一管理及下载&#xff0c;比如分享API文档&#xff0c;因此搭建一个简易的基于Apache服务的Web文件系统&#xff0c;使用浏览器进行文件访问及下载。 部署Apache服务器 本文的linux开发环境是Ubuntu 18.04 安装 sudo apt instal…

Collections和CollectionUtils集合操作

0.引入依赖 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.4</version> </dependency> 一.Collections用法&#xff1a; 01、排序操作 reverse(List list)…

C++面试题(丝)-计算机网络部分(1)

目录 1计算机网络 53 简述epoll和select的区别&#xff0c;epoll为什么高效&#xff1f; 54 说说多路IO复用技术有哪些&#xff0c;区别是什么&#xff1f; 55 简述socket中select&#xff0c;epoll的使用场景和区别&#xff0c;epoll水平触发与边缘触发的区别&#xff1f;…

学术加油站|基于端到端性能的学习型基数估计器综合测评

编者按 本文系东北大学李俊虎所著&#xff0c;也是「 OceanBase 学术加油站」系列第 11 篇内容。 「李俊虎&#xff1a;东北大学计算机科学与工程学院在读硕士生&#xff0c;课题方向为数据库查询优化&#xff0c;致力于应用 AI 技术改进传统基数估计器&#xff0c;令数据库选…