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/