一、zlib库中的API
zlib是非常著名的压缩工具,其官网:[zlib官网]

zlib有2套压缩、解压缩函数,分别为:
(1)压缩函数 deflate() 和解压缩函数 inflate()
int deflate (z_streamp strm, int flush);
int inflate (z_streamp strm, int flush);
(2)压缩函数 compress() 和解压缩函数 decompress()
/**
* 压缩函数,使用默认压缩等级 Z_DEFAULT_COMPRESSION
* 返回:Z_OK 成功;Z_MEM_ERROR 没有足够的内存;Z_BUF_ERROR 没有足够的输出缓存
*/
int compress(Bytef *dest, uLongf *destLen,
const Bytef *source, uLong sourceLen);
/**
* 压缩函数2,可以手动指定压缩等级
* 返回:Z_OK 成功;Z_MEM_ERROR 没有足够的内存;Z_BUF_ERROR 没有足够的输出缓存;
* Z_STREAM_ERROR 压缩 level 参数非法
*/
int compress2(Bytef *dest, uLongf *destLen,
const Bytef *source, uLong sourceLen,
int level);
/**
* 解压缩函数,需要预留足够的输出缓存(解压数据缓存)
* 返回:Z_OK 成功;Z_MEM_ERROR 没有足够的内存;Z_BUF_ERROR 没有足够的输出缓存;
* Z_DATA_ERROR 输入数据错误或不完整
*/
int uncompress(Bytef *dest, uLongf *destLen,
const Bytef *source, uLong sourceLen);
/**
* 解压缩函数2,sourceLen 为指针,表示解压时消耗的源字节数,此时可能由于输出缓存不足,导致数据并没有被解压完
* 返回:Z_OK 成功;Z_MEM_ERROR 没有足够的内存;Z_BUF_ERROR 没有足够的输出缓存;
* Z_DATA_ERROR 输入数据错误或不完整
*/
int uncompress2(Bytef *dest, uLongf *destLen,
const Bytef *source, uLong *sourceLen);
2者区别:
(1)zlib的Deflate和inflate函数接收的是zlib库内自定义的一种数据流格式(z_stream)。
(2) compress和uncompress是对前者的封装,需要用户确保足够内存,一次调用完成操作。
(3)作者在inflate及deflate头文件的文档中说明了这两个文件提供的接口不应该被任何应用程序调用,所以需要使用压缩/解压相关功能的话直接调用compress()和uncompress()即可。
二、例子
1、bufferevent_zlib_server.cpp:
#include <event.h>
#include <event2/bufferevent.h>
#include <event2/listener.h>
#include <zlib.h>
#include <iostream>
#include <signal.h>
#include <string.h>
#define SPORT 5001
using namespace std;
/**
//文件传输模式:
//1. 先接收文件名称.
//2. 回复客户端“OK”.
//3. 再接收文件内容.
*/
typedef struct status{
bool bstart;
FILE *fp;
z_stream *z_input;
status(){
bstart = false;
z_input = NULL;
fp = NULL;
}
~status(){
if (fp){
fclose(fp);
fp = NULL;
}
if (z_input){
inflateEnd(z_input);
delete z_input;
z_input = NULL;
}
}
} STATUS;
/*filter_in()函数是水平触发*/
bufferevent_filter_result filter_in(evbuffer *s,
evbuffer *d,
ev_ssize_t limit,
bufferevent_flush_mode mode,
v

本文详细介绍了zlib库中的压缩和解压缩API,包括deflate()、inflate()、compress()和uncompress()函数的使用,并给出了两个示例:bufferevent_zlib_server.cpp用于服务端接收并解压缩文件,bufferevent_zlib_client.cpp则展示了客户端压缩文件并发送给服务端的过程。文章强调了zlib库中API的使用注意事项和不同函数的适用场景。
最低0.47元/天 解锁文章
1684

被折叠的 条评论
为什么被折叠?



