C++ zlib compress2返回Z_流_错误 char缓冲区[12]={“Testing!12”}; 无符号长压缩尺寸; char*compressed=压缩(缓冲区、12和压缩大小); ... char*压缩(char*缓冲区、无符号长大小、无符号长*压缩大小) { Bytef*inBuffer=重新解释强制转换(缓冲区); uLong inSize=静态铸件(尺寸); Bytef*EXBUFFER=0; uLong Exputfersize=压缩约束(inSize); int error=compress2(突出器和突出器、插入器、插入器、6); 如果(错误!=Z_正常) { 开关(错误) { 案例Z_MEM_错误: std::cerr

C++ zlib compress2返回Z_流_错误 char缓冲区[12]={“Testing!12”}; 无符号长压缩尺寸; char*compressed=压缩(缓冲区、12和压缩大小); ... char*压缩(char*缓冲区、无符号长大小、无符号长*压缩大小) { Bytef*inBuffer=重新解释强制转换(缓冲区); uLong inSize=静态铸件(尺寸); Bytef*EXBUFFER=0; uLong Exputfersize=压缩约束(inSize); int error=compress2(突出器和突出器、插入器、插入器、6); 如果(错误!=Z_正常) { 开关(错误) { 案例Z_MEM_错误: std::cerr,c++,zlib,C++,Zlib,您的exputfer是一个空指针。您不能将空指针作为输出缓冲区传递给compress2,compress2需要一些空间来存储压缩数据,因此请分配一个压缩绑定(inSize)大的缓冲区。从compress2原型中可以明显看出,您不能让compress2分配和“返回”这样一个缓冲回给你 编辑,因为此时的实际错误是Z_STREAM_error,这是因为您传入了无效级别 如果成功,compress2将返回Z_OK, Z_MEM_错误,如果没有足够的 内存,Z_BUF_错误,如果没有 输出缓冲区中有足够的

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

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

如果成功,compress2将返回Z_OK, Z_MEM_错误,如果没有足够的 内存,Z_BUF_错误,如果没有 输出缓冲区中有足够的空间, Z_STREAM_错误,如果级别参数 这是无效的

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

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);
}

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

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

如果成功,compress2将返回Z_OK, Z_MEM_错误,如果没有足够的 内存,Z_BUF_错误,如果没有 输出缓冲区中有足够的空间, Z_STREAM_错误,如果级别参数 这是无效的

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

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);
}

你的
extuffer
必须像
Bytef extuffer[50];
或其他大小。

你的
extuffer
必须像
Bytef extuffer[50];
或其他大小。

@Jookia对,我正在阅读一个NetBSD手册页。当你使用compressBound时,你没问题。你只需要分配一个compressBound(inSize)的缓冲区大,然后传入。@Jookia好的,我正在读一个NetBSD手册页。当您使用compressBound时,您就可以了。您只需要分配一个compressBound(inSize)大的缓冲区,然后传入。