zlib中 compress() 返回 Z_BUF_ERROR的问题

timidsmile 2012-09-28 11:12:09
zlib中 compress() 返回 Z_BUF_ERROR (-5) :表示没有足够的输出缓冲区
返回 Z_MEM_ERROR (-4) : 表示没有足够的内存
返回 Z_OK (0) :成功!

我的程序如下:为什么老是出现 返回 -5 的情况呢?! %>_<%

buf[MAX_LEN]; 是我要压缩的数据,这个是没有问题的。


unsigned long nzdata = 0;
unsigned char *temp;
temp = (unsigned char *)malloc(sizeof(char) * MAX_LEN);
memset(temp, 0, MAX_LEN);
int ret = 1;

ret = compress(temp, &nzdata, buf, MAX_LEN);
if(0 == ret)
{
printf("ok \n");
memset(buf, 0, MAX_LEN);
memcpy(buf, temp, nzdata);
free(temp);
printf("compress success\n");
}
else
{
// return -5: 输出缓冲区不够大
//return -4:没有足够的内存
free(temp);
printf("failed ret = %d \n", ret);
}
...全文
4032 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
饺克力克 2014-08-01
  • 打赏
  • 举报
回复 3
nzdata 的类型必须是 uLongf ,不能是int ,我是这样解决的。
bu进ze退 2013-09-27
  • 打赏
  • 举报
回复
char* srcBuf; int srcLen; int dstLen = 4*srcLen; //设为4倍一般就够了, char* dstBuf = malloc( dstLen ); uncompress(dstBuf, &dstLen,srcBuf, srcLen); 参数类型与原uncompress()函数中的参数不同数据之间装换出错了 http://www.360doc.com/content/11/1025/11/6979751_159010908.shtml
xiaoxiao8310 2012-09-28
  • 打赏
  • 举报
回复
ret = compress(temp, &nzdata, buf, MAX_LEN);
====>
nzdata=MAX_LEN;
ret = compress(buf, &nzdata, temp, MAX_LEN);
ryfdizuo 2012-09-28
  • 打赏
  • 举报
回复
char* srcBuf;
int srcLen;
int dstLen = 4*srcLen; //设为4倍一般就够了,
char* dstBuf = malloc( dstLen );
uncompress(dstBuf, &dstLen,srcBuf, srcLen);
timidsmile 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:
引用 3 楼 的回复:

那不需要更换buf和temp了。但nzdata不能为0.

int compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

compress函数将 source 缓冲区中的内容压缩到 dest 缓冲区。 sourceLen 表示s……
[/Quote]

要压缩的数据 buf 在压缩之前,我判断了一下他的长度的,是对的。。。。压缩后肿么就坏了呢?
额 压缩后的数据长度不是不固定的么。。。。。肿么看捏?
解压也失败了,也没法看啊。。。
xiaoji0507 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用 3 楼 的回复:

那不需要更换buf和temp了。但nzdata不能为0.

int compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

compress函数将 source 缓冲区中的内容压缩到 dest 缓冲区。 sourceLen 表示source 缓冲区的大小(以字……
[/Quote]收到数据是否完全?传个uncompress的长度是否是压缩后的数据长度?
timidsmile 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

那不需要更换buf和temp了。但nzdata不能为0.

int compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

compress函数将 source 缓冲区中的内容压缩到 dest 缓冲区。 sourceLen 表示source 缓冲区的大小(以字节计)。注意函数的第二个参数……
[/Quote]


刚想结贴的。。。可是, 能不能弱弱的再问一下:

我把它压缩之后的数据传输到 windows下 解压时

uncompress() 返回 Z_DATA_ERROR // if the input data was corrupted 如果输入的数据损坏

为什么会出现输入的数据损坏呢?是压缩的问题呢,还是传输有问题捏。。。。。。有木有经验可以分享呀?
timidsmile 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

那不需要更换buf和temp了。但nzdata不能为0.

int compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

compress函数将 source 缓冲区中的内容压缩到 dest 缓冲区。 sourceLen 表示source 缓冲区的大小(以字节计)。注意函数的第二个参数……
[/Quote]


哇哇哇 果然是。我以为 dstLen 是返回的值,初始值大小无所谓呢。。。
嘿嘿~
多谢提点啦~ 啦啦
xiaoxiao8310 2012-09-28
  • 打赏
  • 举报
回复
那不需要更换buf和temp了。但nzdata不能为0.

int compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

compress函数将 source 缓冲区中的内容压缩到 dest 缓冲区。 sourceLen 表示source 缓冲区的大小(以字节计)。注意函数的第二个参数 destLen 是传址调用。当调用函数时,destLen表示 dest 缓冲区的大小,destLen > (sourceLen + 12)*100.1%。当函数退出后,destLen 表示压缩后缓冲区的实际大小。此时 destLen / sourceLen 正好是压缩率。
timidsmile 2012-09-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

ret = compress(temp, &nzdata, buf, MAX_LEN);
====>
nzdata=MAX_LEN;
ret = compress(buf, &nzdata, temp, MAX_LEN);
[/Quote]


额 我的buf是需要被压缩的数据啊, temp 是用来存放被压缩的数据的。。。

70,038

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧