用于压缩的Zlib c++缓冲区的字符大小

zlib c++ char size of buffer for compression

本文关键字:字符 缓冲区 c++ 压缩 Zlib 用于      更新时间:2023-10-16

我正在使用这个函数进行zlib压缩,想知道outbuffer变量是否应该设置为特定的大小?它是否将字符数组限制在这里?这里的长度有限制吗?将它转换为std::string是否有意义,因为我在c++中编译?

 /** Compress a STL string using zlib with given compression level and return
     * the binary data. */
    std::string compress_string(const std::string& str, int compressionlevel = 9)
    {
        z_stream zs;                        // z_stream is zlib's control structure
        memset(&zs, 0, sizeof(zs));
        if (deflateInit(&zs, compressionlevel) != Z_OK)
            throw(std::runtime_error("deflateInit failed while compressing."));
        // For the compress
        deflateInit2(&zs, compressionlevel, Z_DEFLATED,MOD_GZIP_ZLIB_WINDOWSIZE + 16,MOD_GZIP_ZLIB_CFACTOR,Z_DEFAULT_STRATEGY) != Z_OK;
        zs.next_in = (Bytef*)str.data();
        zs.avail_in = str.size();           // set the z_stream's input
        int ret;
        char outbuffer[3222768];
        std::string outstring;
        // retrieve the compressed bytes blockwise
        do {
            zs.next_out = reinterpret_cast<Bytef*>(outbuffer);
            zs.avail_out = sizeof(outbuffer);
            ret = deflate(&zs, Z_FINISH);
            if (outstring.size() < zs.total_out) {
                // append the block to the output string
                outstring.append(outbuffer,zs.total_out - outstring.size());
            }
        }
        while (ret == Z_OK);
        deflateEnd(&zs);
        if (ret != Z_STREAM_END) {          // an error occurred that was not EOF
            std::ostringstream oss;
            oss << "Exception during zlib compression: (" << ret << ") " << zs.msg;
            throw(std::runtime_error(oss.str()));
        }
        return outstring;
    }

这就是deflateBound()的作用。在你的deflateInit2()之后,你可以用输入的大小来调用它,它会给你一个在压缩不可压缩数据时可能扩展的范围。

顺便说一下,在同一结构上两次调用deflateInit/deflateInit2将导致大量内存泄漏。只要给他们中的一个打一次电话。

你应该完整地阅读zlib文档