zlib compress2返回Z_STREAM_ERROR

时间:2011-02-05 20:56:43

标签: 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。我无法弄清楚这个问题。所有变量似乎都是正确的。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

您的outBuffer必须像Bytef outBuffer[50];或其他尺寸。