zlib compress2 возвращает Z_STREAM_ERROR - PullRequest
1 голос
/ 05 февраля 2011
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 Я не могу понять проблему. Все переменные кажутся правильными.

1 Ответ

6 голосов
/ 06 февраля 2011

Ваш outBuffer является указателем NULL. Вы не можете передать NULL-указатель в качестве выходного буфера для compress2, для compress2 требуется некоторое пространство для хранения сжатых данных, поэтому выделите буфер, который compressBound (inSize) большой. Из прототипа сжатия2 видно, что вы не можете выделить compres2 и «вернуть» такой буфер обратно.

Редактировать, поскольку фактическая ошибка на этом этапе - Z_STREAM_ERROR, это потому, что вы перешли на недопустимый уровень.

compress2 возвращает Z_OK в случае успеха, Z_MEM_ERROR если было недостаточно память, Z_BUF_ERROR, если не было достаточно места в буфере вывода, Z_STREAM_ERROR, если параметр уровня неверно.

Вы должны использовать один из следующих уровней:

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