libevent(16)基于zlib进行压缩和解压缩

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

一、zlib库中的API

zlib是非常著名的压缩工具,其官网:[zlib官网]

Zlib压缩算法:LZ77、LZ78、霍夫曼编码、滑动窗口、Rabin-Karp算法、哈希链、I/O缓冲区_rtoax的博客-优快云博客 ...

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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值