- UID
- 1
- 精华
- 积分
- 76361
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
我只是大致看了zlib.h里面的资料。详细的请大家亲自看看这个头文件。我这里只讲一个非常简单的压缩方法。
zlib其实很简单。你只需要定义一个结构体:
z_stream z={0};
然后填写这个结构体:- z.next_in=要压缩的数据的指针;
- z.avail_in=要压缩的数据的大小;
- z.next_out=接收已压缩的数据的缓冲区指针;
- z.avail_out=接收已压缩的数据的缓冲区大小;
复制代码 然后调用zlib的函数进行压缩。代码如下:- if(deflateInit(&z,9)==Z_OK)//最高压缩
- {
- if(deflate(&z,Z_NO_FLUSH)==Z_OK)//压缩
- {
- if(deflate(&z,Z_FINISH)==Z_STREAM_END)//压缩
- {
- if(deflateEnd(&z)==Z_OK)
- fputs("OK\n",stderr);
- else
- fputs("deflateEnd出问题\n",stderr);
- }
- else
- fputs("deflate(Z_FINISH)出问题\n",stderr);
- }
- else
- fputs("deflate(Z_NO_FLUSH)出问题\n",stderr);
- }
- else
- fputs("deflateInit出问题\n",stderr);
复制代码 就能将数据完成压缩。
压缩之后你的数据减少了z.avail_out字节。
解压缩的代码也如法炮制:- z.next_in=szDecompress;
- z.avail_in=sizeof(szDecompress)-z.avail_out;
- z.next_out=szCompress;
- z.avail_out=sizeof(szCompress);
- if(inflateInit(&z)==Z_OK)
- {
- if(inflate(&z,Z_NO_FLUSH)==Z_STREAM_END)
- {
- if(inflate(&z,Z_FINISH)==Z_STREAM_END)
- {
- if(inflateEnd(&z)==Z_OK)
- fputs("OK\n",stderr);
- else
- fputs("inflateEnd\n",stderr);
- }
- else
- fputs("inflate(Z_FINISH)\n",stderr);
- }
- else
- fputs("inflate(Z_NO_FLUSH)\n",stderr);
- }
- else
- fputs("inflateInit\n",stderr);
复制代码 根据我的实验,这样做能够成功完成解压缩。
不过我的错误处理做得很简陋。主要只是想给大家举个例子来说明zlib的用法,所以没有仔细写代码。
现在放出完整的代码:- #include<stdio.h>
- #include<malloc.h>
- #include"zlib.h"
- char szCompress[]="亲,很抱歉打扰到您,在这留言我们也是无奈之举,您的订单号:E6597863661567 您在我们店限时抢购的全自动充气娃娃范冰冰版给我们的差评,对我们小店影响非常大,希望您能百忙之中修改为好评,谢谢。您的电话打不通,我们这是无奈之举,希望您能谅解。";
- char szDecompress[sizeof(szCompress)];
- int main(int argc,char**argv)
- {
- z_stream z={0};
- z.next_in=szCompress;
- z.avail_in=sizeof(szCompress);
- z.next_out=szDecompress;
- z.avail_out=sizeof(szDecompress);
- fprintf(stderr,"Total bytes:%u.\n",z.avail_in);
- if(deflateInit(&z,9)==Z_OK)//最高压缩
- {
- if(deflate(&z,Z_NO_FLUSH)==Z_OK)//压缩
- {
- if(deflate(&z,Z_FINISH)==Z_STREAM_END)//压缩
- {
- if(deflateEnd(&z)==Z_OK)
- fputs("OK\n",stderr);
- else
- fputs("deflateEnd\n",stderr);
- }
- else
- fputs("deflate(Z_FINISH)\n",stderr);
- }
- else
- fputs("deflate(Z_NO_FLUSH)\n",stderr);
- }
- else
- fputs("deflateInit\n",stderr);
- fprintf(stderr,"Decreased %u bytes.\n",z.avail_out);
- z.next_in=szDecompress;
- z.avail_in=sizeof(szDecompress)-z.avail_out;
- z.next_out=szCompress;
- z.avail_out=sizeof(szCompress);
- if(inflateInit(&z)==Z_OK)
- {
- if(inflate(&z,Z_NO_FLUSH)==Z_STREAM_END)
- {
- if(inflate(&z,Z_FINISH)==Z_STREAM_END)
- {
- if(inflateEnd(&z)==Z_OK)
- fputs("OK\n",stderr);
- else
- fputs("inflateEnd\n",stderr);
- }
- else
- fputs("inflate(Z_FINISH)\n",stderr);
- }
- else
- fputs("inflate(Z_NO_FLUSH)\n",stderr);
- }
- else
- fputs("inflateInit\n",stderr);
- puts(szCompress);
- return 0;
- }
复制代码 VC6工程文件下载:
|
|