现在的位置: 首页 > 编程语言 > 正文

zlib之基本函数zlibVersion、deflateInit/deflate/deflateEnd、inflateInit/inflate/inflateEnd

2018年10月05日 编程语言 ⁄ 共 1553字 ⁄ 字号 评论关闭

获取版本函数:zlibVersion

       压缩函数:deflateInit、deflate、deflateEnd

  解压缩函数:inflateInit、inflate、inflateEnd

#include <iostream>
#include <string>

#include <zlib.h>
#include <zconf.h>

using namespace std;

#define CHUNK 16384

int def(FILE *source, FILE *dest, int level)
{
	z_stream strm;
	strm.zalloc = Z_NULL;
	strm.zfree = Z_NULL;
	strm.opaque = Z_NULL;
	deflateInit(&strm, level);

	int flush;
	int have;
	unsigned char in[CHUNK];
	unsigned char out[CHUNK];
	do 
	{
		strm.avail_in = fread(in, 1, CHUNK, source);
		strm.next_in = in;
		flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;

		do 
		{
			strm.avail_out = CHUNK;
			strm.next_out = out;

			deflate(&strm, flush);

			have = CHUNK - strm.avail_out;
			fwrite(out, 1, have, dest);

		} while (0 == strm.avail_out);

	} while (Z_FINISH != flush);

	deflateEnd(&strm);

	return Z_OK;
}

int inf(FILE *source, FILE *dest)
{
	z_stream strm;
	strm.zalloc = Z_NULL;
	strm.zfree = Z_NULL;
	strm.opaque = Z_NULL;
	inflateInit(&strm);

	int ret = Z_OK;
	int have;
	unsigned char in[CHUNK];
	unsigned char out[CHUNK];
	do 
	{
		strm.avail_in = fread(in, 1, CHUNK, source);
		strm.next_in = in;
		if(0 == strm.avail_in)
			break;

		do 
		{
			strm.avail_out = CHUNK;
			strm.next_out = out;

			ret = inflate(&strm, Z_NO_FLUSH);

			have = CHUNK - strm.avail_out;
			fwrite(out, 1, have, dest);

		} while (0 == strm.avail_out);
	} while (Z_STREAM_END != ret);

	inflateEnd(&strm);

	return Z_OK;
}

void main(int argc, char *argv[])
{

	cout<<"zlibVersion:"<<zlibVersion()<<endl;

	FILE *fp1 = fopen("1.txt","rb+");
	FILE *fp2 = fopen("2.txt", "rb+");
	FILE *fp3 = fopen("3.txt", "rb+");
	if((NULL == fp3) || (NULL == fp3) || (NULL == fp3))
	{
		cout<<"fail to open file."<<endl;
		return;
	}

	//压缩
	def(fp1, fp2, Z_DEFAULT_COMPRESSION);

	//解压缩,这个2个函数要分别调用。
	inf(fp2, fp3);
}

此代码参数官网示例代码,本代码为了学习,只写了最简单的函数,没有错误处理。

看完整的示例代码,请看官网示例代码:http://www.zlib.net/zlib_how.html

抱歉!评论已关闭.