• 【Linux】工具:Bundle 库的安装和简单使用


    1. 下载 buddle 库

    要求联网,笔者使用云服务器,在 Xshell 7 上完成的虚拟机操作。

    • 安装 git 工具,通过代码 clone
      (大概率连接不上,推荐直接浏览器下载)
    sudo yum install -y git
    git clone https://github.com/r-lyeh-archived/bundle.git
    
    • 1
    • 2
    • 访问链接下载压缩包

    🔗Github 链接
    在这里插入图片描述

    2. 从 Win 传输文件到 Linux

    • 下载文件传输工具
    sudo yum install -y lrzsz
    
    • 1
    • 笔者使用 Xshell7,可以将下载好的两个压缩包直接拖拽到 Xshell 界面后接收。也可以手下下面代码,在弹窗中选择两个压缩包文件进行传输。
    rz -E
    
    • 1

    3. 解压缩

    • 安装解压缩工具
    sudo yum install -y unzip
    
    • 1
    • 对文件解压缩
    unzip bundle-master.zip 
    
    • 1

    Bundle 库


    Bundle 是一个嵌入式压缩库,支持 23 种压缩算法和 2 种存档格式。使用的时候只需要加入两个文件 bundle.hbundle.cpp 即可(这里代码根据个人文件位置进行编写)

    cp [xxx/bundle.h] .
    cp [xxx/bundle.cpp] .
    
    • 1
    • 2

    压缩

    container pack<container>(unsigned int q, const container &input) 
    
    • 1

    参数 q:

    • 选项,bundle::XXX 定义了一些宏名称,对应不同的压缩算法
    • 正常选择 bundle::LZIP 即可

    参数 input:

    • 存放的是需要压缩的数据

    返回值:

    • 返回压缩后的数据,选用一个容器进行保存,可以用 std::string

    🌰完成一个可执行程序,让我们可以用 bash 来进行文件压缩:
    makefile:

    # 压缩
    compress:compress.cpp bundle.cpp
    	g++ -o $@ $^ -lpthread	# bundle.cpp 里面用到线程,所以这里也要链接线程库
    
    .PHONY:clean
    clean:
    	rm -f compress
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    主程序部分:

    #include 
    #include 
    #include 
    #include "bundle.h"
    
    int main(int argc, char *argv[])
    {
        if (argc < 3)
        {
            std::cout << "argv[1] 是原始文件路径名称" << std::endl;
            std::cout << "argv[2] 是压缩包名称" << std::endl;
            return -1;
        }
    
        std::string ifilename = argv[1];
        std::string ofilename = argv[2];
    
    	// 1
        // 将原始文件内容读取到 body 中
        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);
    
    	// 2
        // 选择压缩方法 lzip,将 body 中的数据压缩保存到 packed
        std::string packed = bundle::pack(bundle::LZIP, body);
    
    	// 3
        // 将压缩后的结果 packed,写入压缩文件中
        std::ofstream ofs;
        ofs.open(ofilename, std::ios::binary);
        ofs.write(&packed[0], packed.size());
    
        ifs.close();
        ofs.close();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    解压缩

    T1 unpack<T1>(const T1 &input)
    
    • 1

    参数 input:

    • 存放的是需要解压缩的数据

    返回值:

    • 返回解压缩后的数据,选用一个容器进行保存,可以用 std::string

    🌰完成一个可执行程序,让我们可以用 bash 来进行压缩文件解压缩:
    makefile:

    # 解压缩
    uncompress:uncompress.cpp bundle.cpp
    	g++ -o $@ $^ -lpthread	# bundle.cpp 里面用到线程,所以这里也要链接线程库
    
    .PHONY:clean
    clean:
    	rm -f uncompress
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    #include 
    #include 
    #include 
    #include "bundle.h"
    
    int main(int argc, char *argv[])
    {
        if (argc < 3)
        {
            std::cout << "argv[1] 是压缩包名称" << std::endl;
            std::cout << "argv[2] 是解压后的文件名称" << std::endl;
            return -1;
        }
        std::string ifilenname = argv[1]; // 压缩包名
        std::string ofilenname = argv[2]; // 解压缩文件名
    	
    	// 1
        // 二进制方式打开压缩文件,并将内容读取到 body 中
        std::ifstream ifs;
        ifs.open(ifilenname, std::ios::binary);
        ifs.seekg(0, std::ios::end);
        size_t fsz = ifs.tellg();
        ifs.seekg(0, std::ios::beg);
        std::string body;
        body.resize(fsz);
        ifs.read(&body[0], fsz);
        ifs.close();
    
    	// 2
        // bundle::unpack 对 body 进行解压,解压后的内容存入 unpacked
        std::string unpacked = bundle::unpack(body);
    
    	// 3
        // 将 unpacked 的内容写入文件中
        std::ofstream ofs;
        ofs.open(ofilenname, std::ios::binary);
        ofs.write(unpacked.c_str(), unpacked.size());
        ofs.close();
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    🥰如果本文对你有些帮助,请给个赞或收藏,你的支持是对作者大大莫大的鼓励!!(✿◡‿◡) 欢迎评论留言~~


  • 相关阅读:
    Go 函数的健壮性、panic异常处理、defer 机制
    华纳云:连接mysql出现2059错误怎么解决
    【面试经典150 | 数组】买卖股票的最佳时机
    【leetcode】矩阵中的距离
    3 UI开发的点点滴滴
    新库上线 | CnOpenData中国保险机构网点全集数据
    Flink概念及应用场景
    kubernetes集群安装
    014 gtsam/examples/LocalizationExample.cpp
    【二:Spring-AOP】
  • 原文地址:https://blog.csdn.net/m0_67470729/article/details/133557914