c++ - zlib compress2 返回 Z_STREAM_ERROR

标签 c++ zlib

char buffer[12] = {"Testing! 12"};

unsigned long compressedSize;
char* compressed = compress(buffer, 12, &compressedSize);

...

char* compress(char* buffer, unsigned long size, unsigned long* compressedSize)
{
    Bytef* inBuffer = reinterpret_cast<Bytef*>(buffer);
    uLong inSize = static_cast<uLong>(size);

    Bytef* outBuffer = 0;
    uLong outBufferSize = compressBound(inSize);

    int error = compress2(outBuffer, &outBufferSize, inBuffer, inSize, 6);

    if(error != Z_OK)
    {
        switch(error)
        {
            case Z_MEM_ERROR:
                std::cerr << "Memory error!" << std::endl;
                break;

            case Z_BUF_ERROR:
                std::cerr << "Buffer error!" << std::endl;
                break;

            default:
                std::cerr << "Unknown error: " << error << std::endl;
                break;
        }

        return 0;
    }

    *compressedSize = static_cast<unsigned long>(outBufferSize);

    return reinterpret_cast<char*>(outBuffer);
}

我点击了“未知错误:-2”,结果是 ZLIB_STREAM_ERROR。我无法弄清楚问题所在。所有变量似乎都是正确的。

最佳答案

您的 outBuffer 是一个 NULL 指针。您不能将 NULL 指针作为输出缓冲区传递给 compress2 ,compress2 需要一些空间来存储压缩数据,因此分配一个 compressBound(inSize) 大的缓冲区。从 compression2 的原型(prototype)可以明显看出,您不能让 compress2 分配并“返回”这样的缓冲区给您。

编辑,因为此时的实际错误是 Z_STREAM_ERROR ,这是因为您传入了一个无效级别。

compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, Z_STREAM_ERROR if the level parameter is invalid.

您应该使用以下级别之一:

#define Z_NO_COMPRESSION         0
#define Z_BEST_SPEED             1
#define Z_BEST_COMPRESSION       9
#define Z_DEFAULT_COMPRESSION  (-1)

关于c++ - zlib compress2 返回 Z_STREAM_ERROR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4909598/

相关文章:

c++ - 在 OpenGL/SDL2 教程中,纹理采样坐标似乎按 2 倍缩放

Ruby Zlib 压缩为相同的输入提供不同的输出

algorithm - 如何从头开始完全实现 PNG 解码器

c++ - vector 的 vector 推回

c++ - 删除 std::list 中的重复项

c++ - 绝对路径...困惑(ubuntu)

c++ - C++11 中的元组有哪些好的用例?

python - 数据库中的 Zlib - Django

c++ - ZLIB解压缩

Node.js:使用 zlib 压缩时定义刷新方法