zlib compress2返回Z_STREAM_ERROR

Joo*_*kia 1 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);
}
Run Code Online (Sandbox Code Playgroud)

我点击'未知错误:-2',结果证明是ZLIB_STREAM_ERROR.我无法弄清楚这个问题.所有变量似乎都是正确的.

nos*_*nos 6

outBuffer是一个NULL指针.你不能将NULL指针作为输出缓冲区传递给compress2,compress2需要一些空间来存储压缩数据,所以分配一个缓冲区,它的compressBound(inSize)很大.从compression2的原型中可以看出,你不能让compres2分配并"返回"这样的缓冲区给你.

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

如果成功则compress2返回Z_OK,如果没有足够的内存则返回Z_MEM_ERROR,如果输出缓冲区中没有足够的空间则返回Z_BUF_ERROR,如果level参数无效则返回Z_STREAM_ERROR.

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

#define Z_NO_COMPRESSION         0
#define Z_BEST_SPEED             1
#define Z_BEST_COMPRESSION       9
#define Z_DEFAULT_COMPRESSION  (-1)
Run Code Online (Sandbox Code Playgroud)