要求联网,笔者使用云服务器,在 Xshell 7 上完成的虚拟机操作。
sudo yum install -y git
git clone https://github.com/r-lyeh-archived/bundle.git
sudo yum install -y lrzsz
rz -E
sudo yum install -y unzip
unzip bundle-master.zip
Bundle 是一个嵌入式压缩库,支持 23 种压缩算法和 2 种存档格式。使用的时候只需要加入两个文件
bundle.h
和bundle.cpp
即可(这里代码根据个人文件位置进行编写)
cp [xxx/bundle.h] .
cp [xxx/bundle.cpp] .
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
主程序部分:
#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;
}
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
#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;
}
🥰如果本文对你有些帮助,请给个赞或收藏,你的支持是对作者大大莫大的鼓励!!(✿◡‿◡) 欢迎评论留言~~