找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 9880|回复: 18

【C】C语言使用zlib压缩任意数据

[复制链接]
发表于 2014-3-30 08:32:03 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
我只是大致看了zlib.h里面的资料。详细的请大家亲自看看这个头文件。我这里只讲一个非常简单的压缩方法。
zlib其实很简单。你只需要定义一个结构体:
z_stream z={0};
然后填写这个结构体:
  1. z.next_in=要压缩的数据的指针;
  2. z.avail_in=要压缩的数据的大小;
  3. z.next_out=接收已压缩的数据的缓冲区指针;
  4. z.avail_out=接收已压缩的数据的缓冲区大小;
复制代码
然后调用zlib的函数进行压缩。代码如下:
  1. if(deflateInit(&z,9)==Z_OK)//最高压缩
  2.     {
  3.         if(deflate(&z,Z_NO_FLUSH)==Z_OK)//压缩
  4.         {
  5.             if(deflate(&z,Z_FINISH)==Z_STREAM_END)//压缩
  6.             {
  7.                 if(deflateEnd(&z)==Z_OK)
  8.                     fputs("OK\n",stderr);
  9.                 else
  10.                     fputs("deflateEnd出问题\n",stderr);
  11.             }
  12.             else
  13.                 fputs("deflate(Z_FINISH)出问题\n",stderr);
  14.         }
  15.         else
  16.             fputs("deflate(Z_NO_FLUSH)出问题\n",stderr);
  17.     }
  18.     else
  19.         fputs("deflateInit出问题\n",stderr);
复制代码
就能将数据完成压缩。
压缩之后你的数据减少了z.avail_out字节。
解压缩的代码也如法炮制:
  1. z.next_in=szDecompress;
  2. z.avail_in=sizeof(szDecompress)-z.avail_out;
  3. z.next_out=szCompress;
  4. z.avail_out=sizeof(szCompress);

  5. if(inflateInit(&z)==Z_OK)
  6. {
  7.     if(inflate(&z,Z_NO_FLUSH)==Z_STREAM_END)
  8.     {
  9.         if(inflate(&z,Z_FINISH)==Z_STREAM_END)
  10.         {
  11.             if(inflateEnd(&z)==Z_OK)
  12.                 fputs("OK\n",stderr);
  13.             else
  14.                 fputs("inflateEnd\n",stderr);
  15.         }
  16.         else
  17.             fputs("inflate(Z_FINISH)\n",stderr);
  18.     }
  19.     else
  20.         fputs("inflate(Z_NO_FLUSH)\n",stderr);
  21. }
  22. else
  23.     fputs("inflateInit\n",stderr);
复制代码
根据我的实验,这样做能够成功完成解压缩。
不过我的错误处理做得很简陋。主要只是想给大家举个例子来说明zlib的用法,所以没有仔细写代码。
现在放出完整的代码:
  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #include"zlib.h"

  4. char szCompress[]="亲,很抱歉打扰到您,在这留言我们也是无奈之举,您的订单号:E6597863661567 您在我们店限时抢购的全自动充气娃娃范冰冰版给我们的差评,对我们小店影响非常大,希望您能百忙之中修改为好评,谢谢。您的电话打不通,我们这是无奈之举,希望您能谅解。";
  5. char szDecompress[sizeof(szCompress)];

  6. int main(int argc,char**argv)
  7. {
  8.     z_stream z={0};
  9.     z.next_in=szCompress;
  10.     z.avail_in=sizeof(szCompress);
  11.     z.next_out=szDecompress;
  12.     z.avail_out=sizeof(szDecompress);

  13.     fprintf(stderr,"Total bytes:%u.\n",z.avail_in);

  14.     if(deflateInit(&z,9)==Z_OK)//最高压缩
  15.     {
  16.         if(deflate(&z,Z_NO_FLUSH)==Z_OK)//压缩
  17.         {
  18.             if(deflate(&z,Z_FINISH)==Z_STREAM_END)//压缩
  19.             {
  20.                 if(deflateEnd(&z)==Z_OK)
  21.                     fputs("OK\n",stderr);
  22.                 else
  23.                     fputs("deflateEnd\n",stderr);
  24.             }
  25.             else
  26.                 fputs("deflate(Z_FINISH)\n",stderr);
  27.         }
  28.         else
  29.             fputs("deflate(Z_NO_FLUSH)\n",stderr);
  30.     }
  31.     else
  32.         fputs("deflateInit\n",stderr);

  33.     fprintf(stderr,"Decreased %u bytes.\n",z.avail_out);

  34.     z.next_in=szDecompress;
  35.     z.avail_in=sizeof(szDecompress)-z.avail_out;
  36.     z.next_out=szCompress;
  37.     z.avail_out=sizeof(szCompress);

  38.     if(inflateInit(&z)==Z_OK)
  39.     {
  40.         if(inflate(&z,Z_NO_FLUSH)==Z_STREAM_END)
  41.         {
  42.             if(inflate(&z,Z_FINISH)==Z_STREAM_END)
  43.             {
  44.                 if(inflateEnd(&z)==Z_OK)
  45.                     fputs("OK\n",stderr);
  46.                 else
  47.                     fputs("inflateEnd\n",stderr);
  48.             }
  49.             else
  50.                 fputs("inflate(Z_FINISH)\n",stderr);
  51.         }
  52.         else
  53.             fputs("inflate(Z_NO_FLUSH)\n",stderr);
  54.     }
  55.     else
  56.         fputs("inflateInit\n",stderr);

  57.     puts(szCompress);
  58.     return 0;
  59. }
复制代码
VC6工程文件下载:
游客,如果您要查看本帖隐藏内容请回复

本帖被以下淘专辑推荐:

回复

使用道具 举报

 楼主| 发表于 2014-3-30 08:40:10 | 显示全部楼层
那一串看似很没有节操的……字符串,其实是我这里弄的要压缩的数据。懒得从文件读取数据来压缩了,所以直接压缩字符串。打开了很多以前的TXT也没有发现一个合适的,所以就只好随手复制粘贴了一份文本放上来做实验了。
zlib能将其压缩掉17个字节的空间。。。压缩比略低啊
回复 赞! 靠!

使用道具 举报

发表于 2014-4-18 18:24:23 | 显示全部楼层
楼主果真广泛涉猎各个领域
回复 赞! 靠!

使用道具 举报

发表于 2016-2-2 15:19:43 | 显示全部楼层
wokankankankankan
回复 赞! 靠!

使用道具 举报

发表于 2016-2-13 22:46:56 | 显示全部楼层
可以试试这个。122
回复 赞! 靠!

使用道具 举报

发表于 2016-6-15 15:15:37 | 显示全部楼层
谢谢分享
回复

使用道具 举报

发表于 2017-6-18 13:17:23 | 显示全部楼层
C6工程文件下载:
回复 赞! 靠!

使用道具 举报

发表于 2017-6-19 18:03:02 | 显示全部楼层
嗯~,有点意思
回复 赞! 靠!

使用道具 举报

发表于 2017-6-19 18:05:23 | 显示全部楼层
uup up uup uuup uuuup
回复 赞! 靠!

使用道具 举报

发表于 2018-8-7 16:49:06 | 显示全部楼层
不知道这个VC6能否移植到 单片机上面去呢?
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2018-8-7 18:33:09 | 显示全部楼层
cwh200512 发表于 2018-8-7 16:49
不知道这个VC6能否移植到 单片机上面去呢?

看情况,单片机也要分不同的情况的。
回复 赞! 靠!

使用道具 举报

发表于 2018-8-8 15:10:32 | 显示全部楼层
0xAA55 发表于 2018-8-7 18:33
看情况,单片机也要分不同的情况的。

我这边移植到 KEIL,cotexr M3 单片机,报错,宏定义估计不对
回复 赞! 靠!

使用道具 举报

发表于 2018-8-23 00:30:54 | 显示全部楼层
yingjiuyngjiu
回复 赞! 靠!

使用道具 举报

发表于 2020-1-23 02:00:02 | 显示全部楼层
厉害厉害 写得很详细
回复 赞! 靠!

使用道具 举报

发表于 2020-3-6 13:45:57 | 显示全部楼层
学习一下
回复

使用道具 举报

发表于 2020-3-7 18:56:02 | 显示全部楼层
谢谢楼主分享!
回复 赞! 靠!

使用道具 举报

发表于 2020-8-13 21:50:48 | 显示全部楼层
正需要这个内容,谢谢!
回复 赞! 靠!

使用道具 举报

发表于 2020-9-23 11:10:56 | 显示全部楼层
学习一下
回复

使用道具 举报

发表于 2021-6-3 12:44:00 | 显示全部楼层
移植会报错
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-21 22:04 , Processed in 0.046583 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表