Loading

bzip2库libbzip2使用(一):实用函数

说明

bzip2提供了底层接口,高级接口以及两个实用函数(Utility functions),这两个实用函数在无stdio的环境中也可以使用,它俩是BZ2_bzBuffToBuffCompressBZ2_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函数中进行调试验证:
image
可以看到压缩后的数据被完整解压了出来。

posted @ 2023-01-10 12:03  sq800  阅读(642)  评论(0编辑  收藏  举报