bzip2提供了底层接口,高级接口以及两个实用函数(Utility functions),这两个实用函数在无stdio的环境中也可以使用,它们分别是BZ2_bzBuffToBuffCompress
和BZ2_bzBuffToBuffDecompress
。
如何引入libbzip2
库,可以参考上一篇的准备部分:https://www.cnblogs.com/sq800/p/17030448.html ,这里不再介绍。
使用
这两个函数是从缓冲区到缓冲区的,直接在内存中进行压缩、解压缩操作。
编写一个函数进行测试:
void utility_test() {
}
在其中编写代码。
1.首先定义一个原始数据:
char buffer[] = "hello world!1234567890hello world!1234567890678ty7t32148776416754327854763214354343231"; //原始数据
int len = strlen(buffer); //原始数据长度
定义一个字符串是为了用于测试,如果有已存在的要压缩的数据,用要压缩的数据即可。
2.然后申请一块内存接收压缩过后的数据
int destLen = len * 1.1 + 600; //压缩后的数据长度,原始数组长度*1.01+600,可以多给一些,保持内存充足。
char* dest = malloc(destLen); //接收压缩过的数据
3.压缩数据
int err; //错误码
//压缩
err = BZ2_bzBuffToBuffCompress(
dest, //目标buffer(压缩后的数据)
&destLen, //目标buffer长度。函数内部压缩完之后,会设置为实际的长度。
buffer, //原始数据
len, //原始数据长度
1, //blockSize100k 字典大小,范围1-9,实际尺寸是100k*N
4, //verbosity 控制台输出压缩信息,范围0-4,数字越小输出越少
30 //默认值30,库内部排序算法相关
);
4.输出压缩结果
//输出压缩结果
char* p = dest;
printf("\n----------\n");
for (int i = 0; i < destLen; i++) {
printf("%d ", *p++);
}
printf("\n----------\n");
5.解压
//解压
char deCompress[1000]; //接收解压缩的数据。解压缩需要的内存大小事先是不知道的。
unsigned int len2 = 1000;
err = BZ2_bzBuffToBuffDecompress(deCompress, &len2, dest, destLen, 0, 4); //参数与压缩类似
6.验证解压结果
//输出解压结果
printf("\n----------\n");
for (int i = 0; i < len2; i++) {
printf("%c", deCompress[i]);
}
printf("\n----------\n");
完整代码
#include "utility-interface.h"
#include <string.h>
void utility_test() {
char buffer[] = "hello world!1234567890hello world!1234567890678ty7t32148776416754327854763214354343231"; //原始数据
int len = strlen(buffer); //原始数据长度
int destLen = len * 1.1 + 600; //压缩后的数据长度,原始数组长度*1.01+600,可以多给一些,保持内存充足。
char* dest = malloc(destLen); //接收压缩过的数据
int err; //错误码
//压缩
err = BZ2_bzBuffToBuffCompress(
dest, //目标buffer(压缩后的数据)
&destLen, //目标buffer长度。函数内部压缩完之后,会设置为实际的长度。
buffer, //原始数据
len, //原始数据长度
1, //blockSize100k 字典大小,范围1-9,实际尺寸是100k*N
4, //verbosity 控制台输出压缩信息,范围0-4,数字越小输出越少
30 //默认值30,库内部排序算法相关
);
//输出压缩结果
char* p = dest;
printf("\n----------\n");
for (int i = 0; i < destLen; i++) {
printf("%d ", *p++);
}
printf("\n----------\n");
//解压
char deCompress[1000]; //接收解压缩的数据。解压缩需要的内存大小事先是不知道的。
unsigned int len2 = 1000;
err = BZ2_bzBuffToBuffDecompress(deCompress, &len2, dest, destLen, 0, 4); //参数与压缩类似
//输出解压结果
printf("\n----------\n");
for (int i = 0; i < len2; i++) {
printf("%c", deCompress[i]);
}
printf("\n----------\n");
}
测试
把这个函数放在main函数中进行调试验证:
可以看到压缩后的数据被完整解压了出来。