首页 > 系统相关 >C++嵌入式压缩库bundle基础操作:内存压缩与zip文件操作

C++嵌入式压缩库bundle基础操作:内存压缩与zip文件操作

时间:2024-07-14 16:18:28浏览次数:10  
标签:string zip 压缩 bundle pak size

bundle是一个轻量级的C++压缩库,集成在一对简洁的文件中(bundle.hbundle.cpp),支持内存数据的压缩与解压缩,以及zip格式文件的操作,方便嵌入到C++程序中执行压缩、解压缩操作。本文将详细介绍如何使用bundle库进行高效的数据压缩处理。

简介

bundle库支持多种压缩算法,使用std::string作为数据容器,string可以存储二进制数据,通过c_str()来访问首地址,通过size()来确定总长度即可。写入二进制数据前,通过resize()函数将string的长度设置好,然后就可以通过指针进行访问。

基本操作

内存数据压缩

使用pack函数,可以轻松实现内存数据的压缩。以下是一个使用LZIP算法压缩数据的基础示例:

1 string packed = pack(LZIP, original);

指定压缩算法为"LZIP",将原始数据压缩成packed

内存数据解压缩

解压缩同样简单,使用unpack函数自动识别压缩算法并进行解压:

1 string unpacked = unpack(packed);

无需指定压缩算法,自动识别并解压缩。

Zip压缩

bundle中的archive类允许用户操作zip格式的文件。archive类是file的vector,通过数字下标索引file结构。file是结构体,继承自map< string, string >,file的属性包括:

  • 1. "/**/"
  • 2. name:文件名
  • 3. type:压缩类型 ZIP
  • 4. data:压缩时是压缩后的数据,解压时是解压后的数据
  • 5. size:压缩前大小
  • 6. zlen:压缩后大小

压缩时,对archive进行赋值,然后调用:

1 binary = pak.zip(60); // compression level = 60 (of 100)

完成后将binary存入文件即可。

解压时,仍然使用zip函数(重载函数)

1 pak_unzip.zip( binary );

然后按照数据结构访问即可。

 

编译静态库

对于大型项目,编译速度可能是个问题。bundle.cpp文件较大,可以通过编译为静态库来提高效率

首先编译成.o文件:

g++ -o obj/bundle.o -c ../bundle.cpp -MMD -I. -std=c++11 -D _GLIBCXX_USE_CXX11_ABI=0 -g -D WIN32

然后编静态库:

ar -rcs libbundle.a bundle.o

示例程序

下面是一个完整的示例程序,展示了如何使用bundle库进行zip打包、解压缩以及内存数据的压缩和解压缩:

 1 #include "common.h"
 2 #include "bundle.h"
 3 
 4 using namespace bundle;
 5 
 6 int main(int argc, char *argv[])
 7 {
 8     string binary; //bundle库使用string存储二进制格式
 9 
10 //测试zip打包
11     archive pak; //archive是file的vector
12     pak.resize(2);
13 
14     //用数字索引file,file是结构体,继承自map< string, string >
15     //file的属性包括:
16     //"/**/"
17     //name:文件名
18     //type:压缩类型 ZIP
19     //data:压缩时是压缩后的数据,解压时是解压后的数据
20     //size:压缩前大小
21     //zlen:压缩后大小
22     pak[0]["name"] = "test.txt";
23     pak[0]["data"] = "hello world";
24 
25     pak[1]["name"] = "test2.txt";
26     pak[1]["data"] = "1337";
27 
28     binary = pak.zip(60); // compression level = 60 (of 100)
29     //binary = pak.bin(archive::ZIP,60); // compression level = 60 (of 100)
30     CComFile cf;
31     cf.open("a.zip","wb");
32     cf.write(binary.c_str(),binary.size()); //将string中的二进制一起存入
33     cf.close();
34 
35 //测试zip解压缩
36     cf.open("b.zip","rb");
37     binary.resize(cf.len);
38     cf.read((u8*)(binary.c_str()),cf.len);
39     cf.close();
40 
41     bundle::archive pak_unzip;
42     pak_unzip.zip( binary );
43     for(auto &it:pak_unzip) //遍历压缩包中的所有文件,打印信息。
44     {
45         u32 size = 0, zlen = 0;
46         sscanf(it["size"].c_str(),"%d",&size);
47         sscanf(it["zlen"].c_str(),"%d",&zlen);
48         string zlen_str = it["zlen"];
49         printf("name: %s, type: %s, size: %d, zlen: %d\n",
50             it["name"].c_str(), it["type"].c_str(), size, zlen);
51         printf("    content:\n    %s\n",it["data"].c_str());
52     }
53 
54 //测试流的压缩、解压缩
55     string original( "There's a lady who's sure all that glitters is gold" );
56     original += original;
57     original += original;
58     original += original;
59     string packed = pack(LZIP, original);
60     string unpacked = unpack(packed);
61     printf("org len: %d,    stream len: %d,        unpack len: %d\n",
62             original.size(),packed.size(),unpacked.size());
63     //cout<<unpacked<<endl;
64 
65     return 0;
66 }

 

标签:string,zip,压缩,bundle,pak,size
From: https://www.cnblogs.com/yangzifb/p/18301697

相关文章

  • 【Java】文件压缩实现过程
           在Java中,文件压缩的实现主要依赖于java.util.zip包中的类,如ZipOutputStream和ZipEntry。这些类提供了创建和操作ZIP格式压缩文件的功能。下面将详细分析Java中文件压缩的实现过程:一、创建Zip文件 创建ZipOutputStream实例:要创建一个新的ZIP文件,首先需要......
  • 【Java】压缩包解压实现过程
        在Java开发中,处理压缩文件(如ZIP、RAR等)是一项常见的任务,特别是在需要处理大量数据、备份或分发应用程序时。Java标准库(JavaSE)提供了对ZIP格式的原生支持,通过java.util.zip包中的类来实现压缩和解压功能。本文将重点介绍如何使用Java来解压ZIP或RAR压缩包。一、解......
  • 使用libzip压缩文件和文件夹
    简单说说自己遇到的坑:分清楚三个组件:zlib、minizip和libzip。zlib是底层和最基础的C库,用于使用Deflate算法压缩和解压缩文件流或者单个文件,但是如果要压缩文件夹就很麻烦,主要是不知道如何归档,在zip内部形成对应的目录。这时就需要用更高级别的库,也就是minizip或libzip。mini......
  • php将png转为jpg,可设置压缩率
    /***将PNG文件转换为JPG文件*@param$pngFilePathstringPNG文件路径*@param$jpgFilePathstringJPG文件路径*@param$qualityintJPG质量,0-100,值越低,压缩率越高*@returnvoid*@throwsException*/functionconvertPngToJpg($pngFilePath,$j......
  • PostgreSQL 中如何处理数据的存储压缩和查询性能的平衡?
    文章目录PostgreSQL中数据存储压缩与查询性能的平衡之道PostgreSQL中数据存储压缩与查询性能的平衡之道在数据库管理的广袤领域中,PostgreSQL犹如一位稳重可靠的智者,为我们提供了丰富的功能和强大的性能。然而,当面对数据存储压缩和查询性能这对“欢喜冤家”时,如......
  • 【PYTHON】运行环境配置之安装tar.gz压缩包
    我们经常会遇到从PYPI网站下载的安装文件没有whl格式,这时我们需要安装tar.gz格式的安装文件。比如图1所示的文件类型,这时我们需要先将该压缩包解压缩得到图2。图1图2接着,我们通过win+r,再输入cmd的方式得到运行窗口如图3。图3接着,我们利用pipinstall+解压后文件夹路......
  • 生成带logo二维码+批量压缩导出
    importcom.google.zxing.BarcodeFormat;importcom.google.zxing.EncodeHintType;importcom.google.zxing.MultiFormatWriter;importcom.google.zxing.common.BitMatrix;importcom.google.zxing.qrcode.decoder.ErrorCorrectionLevel;importjavax.imageio.ImageIO;......
  • 在Linux中,列出几种常见打包工具并写相应解压缩参数。
    在Linux中,有多种常见的打包工具,它们各自具有不同的特点和用法。以下是几种常见的打包工具及其相应的解压缩参数:1.tar简介:tar(tapearchive)是一种广泛使用的Linux打包工具,它主要用于将多个文件和目录打包成单个文件,但不进行压缩。通过与其他压缩工具结合使用,可以实现打包和压缩......
  • 【数组、特殊矩阵的压缩存储】
    目录一、数组1.1、一维数组1.1.1、一维数组的定义方式1.1.2、一维数组的数组名1.2、二维数组1.2.1、二维数组的定义方式1.2.2、二维数组的数组名二、对称矩阵的压缩存储三、三角矩阵的压缩存储四、三对角矩阵的压缩存储五、稀疏矩阵的压缩存储一、数组概述:数组是......
  • 压缩文件的解析方式
            我们常用的压缩文件有两种:后缀为.zip或者.rar,接下来将介绍解析两种压缩文件的代码。需要用到三个jar包:commons-io-2.16.1.jar、junrar-7.5.5.jar、slf4j-api-2.0.13.jar,可以在官网下载,也可以发私信。        这段代码是一个Java程序,包含了一个main方......