0xAA55 发表于 2014-3-30 08:32:03

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

我只是大致看了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;

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工程文件下载:**** Hidden Message *****

0xAA55 发表于 2014-3-30 08:40:10

那一串看似很没有节操的……字符串,其实是我这里弄的要压缩的数据。懒得从文件读取数据来压缩了,所以直接压缩字符串。打开了很多以前的TXT也没有发现一个合适的,所以就只好随手复制粘贴了一份文本放上来做实验了。
zlib能将其压缩掉17个字节的空间。。。压缩比略低啊

0x0208 发表于 2014-4-18 18:24:23

楼主果真广泛涉猎各个领域

小鹿乖乖 发表于 2016-2-2 15:19:43

wokankankankankan

as3852711 发表于 2016-2-13 22:46:56

可以试试这个。122

ImCC 发表于 2016-6-15 15:15:37

谢谢分享

花溪村长 发表于 2017-6-18 13:17:23

C6工程文件下载:

qyq 发表于 2017-6-19 18:03:02

嗯~,有点意思;P

debianyu 发表于 2017-6-19 18:05:23

uup up uup uuup uuuup

技术宅 发表于 2018-8-7 16:49:06

不知道这个VC6能否移植到 单片机上面去呢?

0xAA55 发表于 2018-8-7 18:33:09

cwh200512 发表于 2018-8-7 16:49
不知道这个VC6能否移植到 单片机上面去呢?

看情况,单片机也要分不同的情况的。

cwh200512 发表于 2018-8-8 15:10:32

0xAA55 发表于 2018-8-7 18:33
看情况,单片机也要分不同的情况的。

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

yangyi899 发表于 2018-8-23 00:30:54

yingjiuyngjiu

mrzcpo 发表于 2020-1-23 02:00:02

厉害厉害 写得很详细:lol

LoveZYQ 发表于 2020-3-6 13:45:57

学习一下

NyGevn 发表于 2020-3-7 18:56:02

谢谢楼主分享!

a46213599 发表于 2020-8-13 21:50:48

正需要这个内容,谢谢!

新来的技术宅 发表于 2020-9-23 11:10:56

学习一下

szj 发表于 2021-6-3 12:44:00

移植会报错
页: [1]
查看完整版本: 【C】C语言使用zlib压缩任意数据