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);
}
Run Code Online (Sandbox Code Playgroud)
我点击'未知错误:-2',结果证明是ZLIB_STREAM_ERROR.我无法弄清楚这个问题.所有变量似乎都是正确的.
你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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4593 次 |
| 最近记录: |