`
javayestome
  • 浏览: 1000703 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

C++内嵌代码使用压缩的方法(compress和uncompress函数)需要有zlib,编译时加-lz

阅读更多

转自:http://blogold.chinaunix.net/u3/118848/showart_2363489.html

以下全文转:

使用zlib库里的compress函数与uncompress函数

zlib 是通用的压缩库,提供了一套 in-memory 压缩和解压函数,并能检测解压出来的数据的完整性(integrity)zlib 也支持读写 gzip (.gz) 格式的文件。下面介绍两个最有用的函数——compress uncompress

int compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

compress函数将 source 缓冲区中的内容压缩到 dest 缓冲区。 sourceLen 表示source 缓冲区的大小(以字节计)。注意函数的第二个参数 destLen 是传址调用。当调用函数时,destLen表示 dest 缓冲区的大小,destLen > (sourceLen + 12)*100.1%。当函数退出后,destLen 表示压缩后缓冲区的实际大小。此时 destLen / sourceLen 正好是压缩率。

compress 若成功,则返回 Z_OK;若没有足够内存,则返回 Z_MEM_ERROR;若输出缓冲区不够大,则返回 Z_BUF_ERROR

int uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

uncompress 函数将 source 缓冲区的内容解压缩到 dest 缓冲区。sourceLen source 缓冲区的大小(以字节计)。注意函数的第二个参数 destLen 是传址调用。当调用函数时,destLen 表示 dest 缓冲区的大小, dest 缓冲区要足以容下解压后的数据。在进行解压缩时,需要提前知道被压缩的数据解压出来会有多大。这就要求在进行压缩之前,保存原始数据的大小(也就是解压后的数据的大小)。这不是 zlib 函数库的功能,需要我们做额外的工作。当函数退出后, destLen 是解压出来的数据的实际大小。

uncompress 若成功,则返回 Z_OK ;若没有足够内存,则返回 Z_MEM_ERROR;若输出缓冲区不够大,则返回 Z_BUF_ERROR。若输入数据有误,则返回 Z_DATA_ERROR

zlib 带的 example.c 是个很好的学习范例,值得一观。我们写个程序,验证 zlib 的压缩功能。所写的测试程序保存为 testzlib.cpp ,放在 zlib-1.1.4 目录下。程序源代码:

// testzlib.cpp 简单测试 zlib 的压缩功能

#include <cstring>

#include <cstdlib>

#include <iostream>

#include "zlib.h"

using namespace std;

int main()

{

int err;

Byte compr[200], uncompr[200]; // big enough

uLong comprLen, uncomprLen;

const char* hello = "12345678901234567890123456789012345678901234567890";

uLong len = strlen(hello) + 1;

comprLen = sizeof(compr) / sizeof(compr[0]);

err = compress(compr, &comprLen, (const Bytef*)hello, len);

if (err != Z_OK) {

cerr << "compess error: " << err << '\n';

exit(1);

}

cout << "orignal size: " << len

<< " , compressed size : " << comprLen << '\n';

strcpy((char*)uncompr, "garbage");

err = uncompress(uncompr, &uncomprLen, compr, comprLen);

if (err != Z_OK) {

cerr << "uncompess error: " << err << '\n';

exit(1);

}

cout << "orignal size: " << len

<< " , uncompressed size : " << uncomprLen << '\n';

if (strcmp((char*)uncompr, hello)) {

cerr << "BAD uncompress!!!\n";

exit(1);

} else {

cout << "uncompress() succeed: \n" << (char *)uncompr;

}

}

编译执行这个程序,输出应该是

D:\libpng\zlib-1.1.4>bcc32 testzlib.cpp zlib.lib

D:\libpng\zlib-1.1.4>testzlib

orignal size: 51 , compressed size : 22

orignal size: 51 , uncompressed size : 51

uncompress() succeed:

12345678901234567890123456789012345678901234567890

PS:这两个函数的一个很好的用处便是当需要将一个很占内存的变量写入文件以节省内存时,可以先压缩一下,然后写入文件,当需要使用时再从文件中读出,然后解压缩,以便节省IO时间。此外,有些情况可能还要序列化一下,当要压缩的内存不是一段连续的内存的时候。

分享到:
评论

相关推荐

    兼容、适配QT的压缩 qCompress 和 解压 qUncompress 函数

    这是为了适配QT压缩 qCompress 和 解压 qUncompress 函数而修改的文件, * 本代码中的 zCompress 函数对应QT的 qCompress; * 本代码中的 zUncompress 函数对应QT的 qUncompress; * QT的 QByteArray 用 ZByteArray...

    perl-Compress-Zlib-1.16-12.i386.rpm

    perl-Compress-Zlib-1.16-12.i386.rpm

    Compress-Raw-Zlib-2.054.tar

    Compress-Raw-Zlib-2.054.tar

    perl-Compress-Zlib

    perl-Compress-Zlib最新版本,

    file_compress和file_uncompress

    主要介绍了zlib压缩库中函数file_compress和file_uncompress的使用方法,有挺多的测试例子,已验证完毕

    zlib的C++封装类压缩文件

    项目培训需要封装了zlib库生成压缩文件,没什么技术含量,放出来.^-^. 有需要的童鞋拿去,还是想提醒下偷懒的童鞋要看懂代码。 http://blog.csdn.net/infoworld/article/details/41290969

    C++ 基于ZLIB压缩库的数据或文件的压缩与解压缩小程序.zip

    自写C++ 基于ZLIB压缩库的数据或文件的压缩与解压缩小程序.zip

    ZLIB库,压缩和解压的函数库

    ZLIB库 用于开发压宿软件的C库 里面主要用到两函数,一个是压缩,一个是解压

    STM32(或其它国产单片机)移植Zlib进行数据压缩功能

    Zlib主要用在上位机,因为无论是Windows、Linux、MAC都有足够的内存,单片机RAM非常小,源码中MAX_WBITS默认是15,需要两个32k才能正常工作,compress2也只能实现一次数据传入压缩。都不适合单片机使用。我在移植时...

    zlib的使用小例

    本实例使用zlib中的主要压缩与解压函数compress\uncompress,对文件进行压缩和解压,对于使用zlib的初学者有一定的帮助。

    commons-compress-1.21-API文档-中文版.zip

    赠送jar包:commons-compress-1.21.jar; 赠送原API文档:commons-compress-1.21-javadoc.jar; 赠送源代码:commons-compress-1.21-sources.jar; 赠送Maven依赖信息文件:commons-compress-1.21.pom; 包含翻译后...

    使用zlib库压缩目录

    zlib一直是C/C++开发者的首选zip,gz库压缩方案, 但是官方的例子并不支持压缩目录, 说的也不清楚, 我感觉官方貌似是想考验下库的使用者? http://blog.csdn.net/infoworld/article/details/60480313

    压缩与解压缩使用的zlib.lib库

    压缩包里包含zlib.lib、zlib.h、zconf.h三个文件以及一个简单的使用...在发送的包特别大的情况下,可以调用zlib.lib里的compress和uncompress函数对数据进行压缩和解压缩。希望对那些想压缩内存中的数据的人有所帮助

    commons-compress-1.4.1-API文档-中文版.zip

    赠送jar包:commons-compress-1.4.1.jar; 赠送原API文档:commons-compress-1.4.1-javadoc.jar; 赠送源代码:commons-compress-1.4.1-sources.jar; 赠送Maven依赖信息文件:commons-compress-1.4.1.pom; 包含...

    易语言调用as_zlib压缩解压源码

    as使用的ByteArray类:compress 和 uncompress 方法。易语言对象载入flash,源码来自论坛网友分享的源码,需要写本地文件,有点麻烦!。尝试过用酷哥的支持库,内存加载swf字节集,经测试发现,CallFunction方法接收...

    commons-compress-1.20-API文档-中英对照版.zip

    赠送jar包:commons-compress-1.20.jar; 赠送原API文档:commons-compress-1.20-javadoc.jar; 赠送源代码:commons-compress-1.20-sources.jar; 赠送Maven依赖信息文件:commons-compress-1.20.pom; 包含翻译后...

    commons-compress-1.19-API文档-中文版.zip

    赠送jar包:commons-compress-1.19.jar; 赠送原API文档:commons-compress-1.19-javadoc.jar; 赠送源代码:commons-compress-1.19-sources.jar; 赠送Maven依赖信息文件:commons-compress-1.19.pom; 包含翻译后...

    压缩代码compress

    eclipse 项目 导入即可 可运行 有jar包 有好几种不同的压缩算法的比较 压缩代码compress

    Compress-Zlib

    该模块提供了大部分的ZLIB压缩一个Perl接口

    commons-compress-1.20-API文档-中文版.zip

    赠送jar包:commons-compress-1.20.jar; 赠送原API文档:commons-compress-1.20-javadoc.jar; 赠送源代码:commons-compress-1.20-sources.jar; 赠送Maven依赖信息文件:commons-compress-1.20.pom; 包含翻译后...

Global site tag (gtag.js) - Google Analytics