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。我无法弄清楚这个问题。所有变量似乎都是正确的。
答案 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];
或其他尺寸。