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

这篇具有很好参考价值的文章主要介绍了云备份——第三方库简单介绍并使用(上)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一,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;
}

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

二,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;
}

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

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

云备份——第三方库简单介绍并使用(上),linux,c++文章来源地址https://www.toymoban.com/news/detail-687967.html

到了这里,关于云备份——第三方库简单介绍并使用(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第三方库介绍——libpng

    libpng是一款C语言编写的比较底层的读写PNG文件的跨平台的库。由于依赖于zlib库,所以在安装libpng时往往还需要安装zlib库。 zlib库和libpng库的下载地址:https://jaist.dl.sourceforge.net/project/libpng/ libpng库下载的版本为:libpng-1.6.37 zlib库下载的版本为:zlib-1.2.11 由于某些系统可能自带

    2024年02月11日
    浏览(35)
  • 第三方库介绍——zlib库

    zlib是一套通用的解压缩开源库,提供了内存(in-memory)压缩和解压函数,能检测解压出来的数据完整性,zlib 也支持读写 gzip (.gz) 格式的文件,可以阅读:zlib库介绍三:gzip(.gz格式)文件读写 默认且目前仅使用deflate算法压缩data部分;deflate是一种压缩算法,是huffman编码的一种加

    2024年02月09日
    浏览(32)
  • 仅仅是调用第三方接口那么简单吗?

    最近有个项目需要本地处理之后,然后调用第三方接口,本来开始觉得很简单得事情,不就是调用第三方接口吗?但是却一波三折。 首先有了下面的第一版的设计。 这个设计很简单,也是最容易想到的。主要有下面几步 1、本地处理; 2、调用第三方接口; 3、本地日志打印

    2024年02月06日
    浏览(48)
  • 盘点Python那些简单实用的第三方库

    💻 大家好,我是哈桑c。本文为大家介绍 Python 中有趣的第三方库,希望大家看完有所收获。 关于本文中介绍的所有的第三方库,笔者并不会每一个都进行详细的介绍,因为如果都一一进行介绍的话整篇文章就显得太啰嗦了。所有更多还是针对这些库的要点进行讲解,关于更

    2024年01月20日
    浏览(36)
  • 【配置环境】Windows和Linux下安装和使用C/C++第三方库管理工具vcpkg

    目录 一,环境准备 二,vcpkg简介 三,Window系统下载vcpkg 四,Linux系统下载vcpkg 五,vcpkg命令介绍 1.命令参照表 2.常用的vcpkg命令以及详细解释 Git - Downloads 根据平台下载最新版本(傻瓜式安装) Visual Studio 2015 或更新的版本( 包含英文语言包 ),点击VS界面菜单栏的 工具-获

    2024年02月14日
    浏览(37)
  • OAuth 2.0 协议介绍【实现 GitHub 第三方登录】

    OAuth(是 Open Authorization 开放授权的缩写),在全世界得到广泛应用,目前的版本是2.0版。 本文会对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749。 OAuth 2.0 是一个开放标准,用于授权用户访问另一个应用程序的资源,而无需将用户的凭据(比如

    2024年02月20日
    浏览(51)
  • 群星璀璨的Python江湖,Python第三方库介绍

    如果Python语言是一个江湖,那么python第三方库就是一个个身怀绝技的江湖侠客,这些侠客在这偌大的江湖尽情挥洒着江湖侠气。有人名扬天下,有人默默无闻,有人纵横捭阖,有人黯然谢幕,每天都在上演人生的悲欢离合。 那么什么是python第三方库呢? python是一门非常流行

    2024年03月10日
    浏览(38)
  • 从头开始用JAVA创建一个自己的简单API并实现第三方调用

            相信大家对这个词汇并不陌生,通俗来说API就是程序之间的接口,在学习和工作中经常会调用别人的API,那么如果我们要做一个自己的API,要如何下手呢。本文将用Spring+JAVA编写一个简单的API,过程可供初学者参考。         为了顾及完全没有经验的小白(比如我

    2024年02月10日
    浏览(39)
  • Python第三方库安装——使用vscode、pycharm安装Python第三方库

    在这里介绍vscode、Pycharm安装python第三方库的方法。 操作系统:windows10 专业版 环境如下: Pycharm Comunity 2022.3 Visual Studio Code 2019 Python 3.8 pip:23.0.1 pycharm是一款很强大的、专用于写python的ide。 小白式安装第三方库往往能给初学者一种 “高级感” ,而对于使用惯了Linux的人而言

    2024年02月03日
    浏览(46)
  • 本仓库主要用来收集一些 Android 开发中常用的第三方 UI 库及其简单 Demo

    | 第三方库 | 介绍 | Demo | 使用说明 | | — | — | — | — | | CircleImageView | 显示圆形图片 | CircleImageViewDemo | Android UI Libs 之 CircleImageView.md | | android-gif-drawable | 显示 gif 图片 | android-gif-drawabledemo | Android UI Libs 之 android-gif-drawable.md | | AndroidSwipeLayout | 滑动布局,可以实现侧滑菜单与侧

    2024年04月15日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包