1.bundle 的概要
BundleBundle
是一个嵌入式压缩库(嵌入是指直接嵌入到代码中,可以直接使用无需编译),支持 23
种压缩算法和 2
种存档格式。
2.bundle 的使用
使用的时候只需要手动拷贝添加两个 bundle.h
和 bundle.cpp
文件即可,简单易用,这也是为什么我推荐这个库的原因之一。您直接前往对应的 git
仓库(https://github.com/r-lyeh-archived/bundle)进行下载即可。我们来尝试使用一下代码,再来进行总结。
cpp
//pack.cpp
#include <iostream>
#include <string>
#include <fstream>
#include "bundle.h"
int main(int argc, char const *argv[])
{
//1.获取文件名字
if (argc < 3) return -1;
std::cout << "原始文件路径" << argv[1];
std::cout << "压缩文件路径" << argv[2];
std::string iFileName = argv[1];
std::string oFileName = argv[2];
//2.获取原始文件的大小
std::ifstream ifs;
ifs.open(iFileName, std::ios::binary);
ifs.seekg(0, std::ios::end); //偏移量 off, 基准 way, 这里就将文件读取位置移动到文件的末尾
size_t fsize = ifs.tellg(); //获取到文件大小
ifs.seekg(0, std::ios::beg);
//3.读取文件内容到文件流中
std::string body;
body.resize(fsize); //调整为打开文件的大小
ifs.read(&body[0], fsize); //读取文件的内容
ifs.close();
//4.将原始文件转化为压缩文件
std::string packed = bundle::pack(bundle::LZIP, body); //选择 LZIP 格式对文件内容进行压缩
std::ofstream ofs;
ofs.open(oFileName, std::ios::binary);
ofs.write(&packed[0], packed.size()); //保存压缩后的内容
ofs.close();
//5.回显压缩信息
std::cout
<< "压缩成功" << std::endl
<< "压缩前:" << fsize << " "
<< "压缩后:" << packed.size()
<< std::endl;
return 0;
}
cpp
//unpack.hpp
#include <iostream>
#include <string>
#include <fstream>
#include "bundle.h"
int main(int argc, char const *argv[])
{
//1.获取文件名字
if (argc < 3) return -1;
std::cout << "原始文件路径" << argv[1];
std::cout << "解缩文件路径" << argv[2];
std::string iFileName = argv[1];
std::string oFileName = argv[2];
//2.获取原始文件的大小
std::ifstream ifs;
ifs.open(iFileName, std::ios::binary);
ifs.seekg(0, std::ios::end); //偏移量 off, 基准 way, 这里就将文件读取位置移动到文件的末尾
size_t fsize = ifs.tellg(); //获取到文件大小
ifs.seekg(0, std::ios::beg);
//3.读取文件内容到文件流中
std::string body;
body.resize(fsize); //调整为打开文件的大小
ifs.read(&body[0], fsize); //读取文件的内容
ifs.close();
//4.将原始文件转化为解缩文件
std::string unpacked = bundle::unpack(body); //直接进行解缩
std::ofstream ofs;
ofs.open(oFileName, std::ios::binary);
ofs.write(&unpacked[0], unpacked.size()); //保存压缩后的内容
ofs.close();
//5.回显压缩信息
std::cout
<< "解压成功" << std::endl
<< "解压前:" << fsize << " "
<< "解压后:" << unpacked.size()
<< std::endl;
return 0;
}
我们可以通过 md5sum "文件名"
计算 md5
值来检查文件解压前和解压后内容是否相同(内容相同则 md5
值相同)
因此实际上这个库使用起来非常简单,单纯选择压缩方式然后使用 bundle::pack()
压缩即可,解压无需选择解压方式,直接调用 bundle::unpack()
。