求助:Zlib uncompress 异常!

lkenan 2017-01-16 06:29:10
小弟最近用到压缩解压,选择使用zlib库,解压缩时,总是在 uncompress 处发生异常:0xC0000005: 读取位置 0xcdcdcdcd 时发生访问冲突。。。纠结了3天,无果,特来求救。
代码:(暂不考虑在文件中保存大小,用最简单的方法,测 uncompress)

//定义接收缓冲区
const int MAX_BUFFER_SIZE = 1024*1024*4;
unsigned char DATA_BUFFER[MAX_BUFFER_SIZE];
//函数
{
FILE *f1 = fopen(cFileName,"r");
if (f1)
{
int Len; //解压文件长度
fseek(f1,0,2);
Len = ftell(f1);
fseek(f1,0,0);
char *data = new char[Len ];
fread(data,1,Len ,f1); //读取文件内容到 data
fclose(f1);

uLong dst_len = MAX_BUFFER_SIZE;
Bytef * dst = (Bytef*)DATA_BUFFER; //接收解压文件
uncompress(dst,&dst_len,(Bytef *)data,(uLong)Len ); //解压
}
delete [] data;
}
注:使用几kb的小文件进行压缩、解压。总是在 uncompress 处异常

请各位路过的兄弟们,帮一把。。。多谢!分不多,请笑纳
...全文
1432 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
bitera 2020-04-22
  • 打赏
  • 举报
回复
1.2.11版本这个错误的解决方案 https://blog.csdn.net/ankang654321/article/details/83187289 编译前只需要在工程 预处理器,去掉 ASMINF 定义, VS2010 Release模式编译亲测有效。
share7we 2018-07-10
  • 打赏
  • 举报
回复
困扰了我一天问题,解决了,感谢#7
幽行 2017-11-14
  • 打赏
  • 举报
回复
引用 10 楼 ananluowei 的回复:
1.2.11我也碰到这个问题,inflate_fast崩溃 网上搜了一下,汇编版本的有坑 解决方法是编译zlib的时候用releasewithoutasm 这样生成的库是不崩溃的
使用release版本就没有问题了。 另外在网上看到另一个注释《inffast.c》这个文件中的预定义值;ASMINF,会出现另一个问题。重复定义的。
大尾巴猫 2017-10-01
  • 打赏
  • 举报
回复
1.2.11我也碰到这个问题,inflate_fast崩溃 网上搜了一下,汇编版本的有坑 解决方法是编译zlib的时候用releasewithoutasm 这样生成的库是不崩溃的
污点好人 2017-05-15
  • 打赏
  • 举报
回复
引用 8 楼 uo7801 的回复:
[quote=引用 7 楼 JetLuo 的回复:] 我的问题解决。用的1.2.11出现问题,换成1.2.3就正常了。
跪谢,同样的问题,已解决[/quote] 我用1.2.11也有这个问题,当uncompress 的dest缓冲区长度大于256就会出现,找了个旧版1.2.7的没有这个问题。
dragon11021312 2017-03-30
  • 打赏
  • 举报
回复
引用 7 楼 JetLuo 的回复:
我的问题解决。用的1.2.11出现问题,换成1.2.3就正常了。
跪谢,同样的问题,已解决
JetLuo 2017-03-03
  • 打赏
  • 举报
回复
我的问题解决。用的1.2.11出现问题,换成1.2.3就正常了。
JetLuo 2017-03-01
  • 打赏
  • 举报
回复
compress后直接uncompress,也出现同样的问题?
UESTC少尉 2017-02-23
  • 打赏
  • 举报
回复
我也遇到同样的问题,不知道楼主解决没有呢
赵4老师 2017-01-17
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
ipqtjmqj 2017-01-17
  • 打赏
  • 举报
回复
fopen打开用"rb"
lunat 2017-01-17
  • 打赏
  • 举报
回复
compress/uncompress是内存压缩的,不带文件头,你可以使用zip.h和unzip.h里面的函数,参考: http://blog.csdn.net/okadler0518/article/details/6131327
lkenan 2017-01-16
  • 打赏
  • 举报
回复
补充: 在调用 compress 下面,再调用 uncompress,是没问题的。就是读取文件,解压出错! 不是 uncompress 返回错误,是直接发生异常! 压缩时测试代码如下: //压缩数据z_compress if(compress(pOut, &uOut, pIn, uIn) != Z_OK) { printf("compress failed!\n"); return -1; } if(uncompress(pIn, &uIn, pOut, uOut) != Z_OK) { printf("compress failed!\n"); return -1; } 唉,折腾的,我都想先拿压缩文件,再压缩一次,然后再连续解压两次啦!(中间调整缓冲区大小)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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