【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 *****
那一串看似很没有节操的……字符串,其实是我这里弄的要压缩的数据。懒得从文件读取数据来压缩了,所以直接压缩字符串。打开了很多以前的TXT也没有发现一个合适的,所以就只好随手复制粘贴了一份文本放上来做实验了。
zlib能将其压缩掉17个字节的空间。。。压缩比略低啊 楼主果真广泛涉猎各个领域 wokankankankankan
可以试试这个。122 谢谢分享 C6工程文件下载: 嗯~,有点意思;P uup up uup uuup uuuup 不知道这个VC6能否移植到 单片机上面去呢? cwh200512 发表于 2018-8-7 16:49
不知道这个VC6能否移植到 单片机上面去呢?
看情况,单片机也要分不同的情况的。 0xAA55 发表于 2018-8-7 18:33
看情况,单片机也要分不同的情况的。
我这边移植到 KEIL,cotexr M3 单片机,报错,宏定义估计不对 yingjiuyngjiu 厉害厉害 写得很详细:lol 学习一下 谢谢楼主分享! 正需要这个内容,谢谢! 学习一下 移植会报错
页:
[1]