• compress uncompress函数


    原文地址:http://lxflfr.blog.163.com/blog/static/129119579200983004539908/

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

    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

  • 相关阅读:
    CMDXP.CMD命令大全
    ASP.NET 页生命周期概述
    使用 ASP.NET 2.0提供的WebResource管理资源
    软件包管理 之 Fedora / Redhat 软件包管理指南
    开源代码分析研究 之 BugNet (2008年1月14日更新 第一章BugNet 简介 已完成)
    软件包管理 之 如何编译安装源码包软件
    硬件管理 之 Linux 硬件管理的基础知识
    软件包管理 之 fedorarpmdevtools 工具介绍
    软件包管理 之 Fedora/Redhat 在线安装更新软件包,yum 篇 ── 给新手指南
    系统引导管理 之 系统引导过程及硬盘分区结构论述
  • 原文地址:https://www.cnblogs.com/zhuiyi/p/2810320.html
Copyright © 2020-2023  润新知