美文网首页
理解和使用zlib库

理解和使用zlib库

作者: 微雨旧时歌丶 | 来源:发表于2017-12-26 15:33 被阅读0次

    http://blog.csdn.net/querw/article/details/51569274


    原理部分 略,详见原文

    示例如下:

    #include <stdio.h>
    #include <string.h>
    #include <assert.h>
    
    extern "C"
    {
        #include "zlib.h"
    }
    #pragma comment(lib, "zlib.lib")
    
    int dump_buffer(const Bytef* buf, size_t len)
    {
        for(size_t i = 0; i < len; ++i)
        {
            printf("%02x", buf[i]);
        }
        return 0;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        const char* inBuf = "1234,abcd,ABCD,^#@!.";
        Bytef outBuf[1024] = {0};
        Bytef restoreBuf[1024] = {0};
        int outLen = 0;
        int restoreLen = 0;
        int err = 0;
        z_stream stream;
        int fmt = 2; // 0: zlib; 1: gzip; 2: raw
    
        printf("source string:%s\r\n", inBuf);
    
        // 压缩
        stream.next_in = (z_const Bytef *)inBuf;
        stream.avail_in = (uInt)strlen(inBuf);
    
        stream.next_out = (Bytef *)outBuf;
        stream.avail_out = 1024;
    
        stream.zalloc = (alloc_func)0;
        stream.zfree = (free_func)0;
        stream.opaque = (voidpf)0;
    
        if(0 == fmt)
        {
            // zlib
            err = deflateInit(&stream, Z_DEFAULT_COMPRESSION);
            assert(Z_OK == err);
    
            err = deflate(&stream, Z_FINISH);
            assert(err == Z_STREAM_END);
    
            outLen = stream.total_out;
    
            err = deflateEnd(&stream);
    
            printf("zlib string(HEX):");
        }
        else if(1 == fmt)
        {
            // gzip
            err = deflateInit2(&stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, MAX_WBITS + 16, 8, Z_DEFAULT_STRATEGY);
            assert(Z_OK == err);
    
            err = deflate(&stream, Z_FINISH);
            assert(err == Z_STREAM_END);
    
            outLen = stream.total_out;
    
            err = deflateEnd(&stream);
    
            printf("gzip string(HEX):");
        }
        else if(2 == fmt)
        {
            // raw
            err = deflateInit2(&stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, MAX_WBITS * -1, 8, Z_DEFAULT_STRATEGY);
            assert(Z_OK == err);
    
            err = deflate(&stream, Z_FINISH);
            assert(err == Z_STREAM_END);
    
            outLen = stream.total_out;
    
            err = deflateEnd(&stream);
    
            printf("raw deflate string(HEX):");
        }
        else
        {
            assert(0);
        }
    
        dump_buffer(outBuf, outLen);
        printf("\r\n");
    
        // 解压缩
        stream.next_in = (z_const Bytef *)outBuf;
        stream.avail_in = (uInt)outLen;
    
        stream.next_out = (Bytef *)restoreBuf;
        stream.avail_out = 1024;
    
        stream.zalloc = (alloc_func)0;
        stream.zfree = (free_func)0;
        stream.opaque = (voidpf)0;
    
        if(0 == fmt)
        {
            // zlib
            err = inflateInit(&stream);
            assert(Z_OK == err);
    
            err = inflate(&stream, Z_FINISH);
            assert(err == Z_STREAM_END);
    
            restoreLen = stream.total_out;
    
            err = inflateEnd(&stream);
        }
        else if(1 == fmt)
        {
            // gzip
            err = inflateInit2(&stream, MAX_WBITS + 16);
            assert(Z_OK == err);
    
            err = inflate(&stream, Z_FINISH);
            assert(err == Z_STREAM_END);
    
            restoreLen = stream.total_out;
    
            err = inflateEnd(&stream);
        }
        else if(2 == fmt)
        {
            // raw
            err = inflateInit2(&stream, MAX_WBITS * -1);
            assert(Z_OK == err);
    
            err = inflate(&stream, Z_FINISH);
            assert(err == Z_STREAM_END);
    
            restoreLen = stream.total_out;
    
            err = inflateEnd(&stream);
        }
        else
        {
            assert(0);
        }
    
        printf("restored string:%s\r\n", (char*)restoreBuf);
    
        printf("Press Enter to continue...");
        getchar();
        return err;
    }
    

    fmt 分别设置为 0, 1, 2 时的运行结果:
    source string:1234,abcd,ABCD,^#@!.
    zlib string(HEX):789c33343236d1494c4a4ed171747276d189537650d40300357804f3
    restored string:1234,abcd,ABCD,^#@!.

    source string:1234,abcd,ABCD,^#@!.
    gzip string(HEX):1f8b080000000000000b33343236d1494c4a4ed171747276d189537650d4030065d6b0c314000000
    restored string:1234,abcd,ABCD,^#@!.

    source string:1234,abcd,ABCD,^#@!.
    raw deflate string(HEX):33343236d1494c4a4ed171747276d189537650d40300
    restored string:1234,abcd,ABCD,^#@!.

    可以看到中间的压缩数据都是相同的,只是头尾不同.

    相关文章

      网友评论

          本文标题:理解和使用zlib库

          本文链接:https://www.haomeiwen.com/subject/wrhjgxtx.html