bzip数据压缩 C调用

2024-04-03 14:48
文章标签 调用 数据压缩 bzip

本文主要是介绍bzip数据压缩 C调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


bzip官网:http://www.bzip.org/  有源码及英文文档。


官网的英文文档比较齐全,可就是没有找到类似的demo代码,没办法,只能结合已有的官方文档,自己摸索了。

由于需要对内存的数据进行加压解压处理,因此调用的是bzip提供的低级接口:

typedef struct {char *next_in;          // 输入指针unsigned int avail_in;  // 输入数据长unsigned int total_in_lo32;unsigned int total_in_hi32;char *next_out;         // 输出指针unsigned int avail_out; // 输出缓冲大小unsigned int total_out_lo32;unsigned int total_out_hi32;void *state;void *(*bzalloc)(void *,int,int);void (*bzfree)(void *,void *);void *opaque;
} bz_stream;int BZ2_bzCompressInit ( bz_stream *strm, int blockSize100k, int verbosity,int workFactor );
//一般使用默认推荐参数:BZ2_bzCompressInit(strm,5,2,30);int BZ2_bzCompress ( bz_stream *strm, int action );int BZ2_bzCompressEnd ( bz_stream *strm );int BZ2_bzDecompressInit ( bz_stream *strm, int verbosity, int small );
// 一般使用默认推荐参数:BZ2_bzDecompressInit(strm,2,1);int BZ2_bzDecompress ( bz_stream *strm );int BZ2_bzDecompressEnd ( bz_stream *strm );

压缩过程:

1. 初始化压缩参数,分配资源。

2. 对数据进行压缩,输出压缩后的数据。

    压缩的过程实际上是一个有限状态机处理过程,看英文文档感觉比较绕,比较麻烦。

3. 销毁释放分配的资源。



压缩过程的有限状态机:

RUNNING   - 输入数据进行压缩。

FLUSHING  - 输出压缩后的数据。

FINISHING - 没有输入,只有输出。

IDLE      - 压缩未开始或者压缩结束。



压缩遵循的原则:
  

  1. 进入压缩,即进入RUNNING状态,输入待压缩数据,如果BZ2_bzCompress ( bz_stream *strm, int action )返回BZ_RUN_OK,则继续输入。直到返回非BZ_RUN_OK或者没有更多的输入。

  2. 如果上面返回的是BZ_FLUSH_OK,进入FLUSHING状态,输出压缩后的数据。

  3. 如果返回的是BZ_FINISH_OK,进入FINISHING状态,进行输出,直到返回BZ_STREAM_END结束。


  在压缩的过程中,如果出现错误或者异常,如果捕获到其他异常,压缩过程应该就是失败的了。具体异常返回查看

这篇关于bzip数据压缩 C调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/873203

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

一分钟带你上手Python调用DeepSeek的API

《一分钟带你上手Python调用DeepSeek的API》最近DeepSeek非常火,作为一枚对前言技术非常关注的程序员来说,自然都想对接DeepSeek的API来体验一把,下面小编就来为大家介绍一下... 目录前言免费体验API-Key申请首次调用API基本概念最小单元推理模型智能体自定义界面总结前言最

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

redis防止短信恶意调用的实现

《redis防止短信恶意调用的实现》本文主要介绍了在场景登录或注册接口中使用短信验证码时遇到的恶意调用问题,并通过使用Redis分布式锁来解决,具有一定的参考价值,感兴趣的可以了解一下... 目录1.场景2.排查3.解决方案3.1 Redis锁实现3.2 方法调用1.场景登录或注册接口中,使用短信验证码场

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

Idea调用WebService的关键步骤和注意事项

《Idea调用WebService的关键步骤和注意事项》:本文主要介绍如何在Idea中调用WebService,包括理解WebService的基本概念、获取WSDL文件、阅读和理解WSDL文件、选... 目录前言一、理解WebService的基本概念二、获取WSDL文件三、阅读和理解WSDL文件四、选择对接

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python