zlib的inflate函数问题

XSign 2013-07-31 06:26:28
最近在写一个下载文件的东西,下载回来的文件是一个经过zip压缩过得zip包(zip包中肯定只有一个文件)。
手头有一个别人用php写的功能相同的脚本(但是不符合需求T.T)我用C重写了一下他的逻辑,但是在inflate数据的时候,遇到了一些问题。

他用的是php的gzinflate解压数据。我试着用zlib的inflate解压同一数据,但是zlib报错data_error.
我的需求是直接解压内中压缩后的数据,然后写文件。
哪位高手能指导一下?

附我用c写的解压代码,decodedStr为string,内容是*.zip包的全部数据:
revert_*_bytes为little endian转换big endian的转换函数。

unsigned int flag = revert_two_bytes(decodedStr.substr(8, 2));
unsigned int filename_len = revert_two_bytes(decodedStr.substr(26, 2));
unsigned int ext_len = revert_two_bytes(decodedStr.substr(28, 2));
unsigned int compressed_data_len = revert_four_bytes(decodedStr.substr(18, 4));
unsigned int uncompressed_data_len = revert_four_bytes(decodedStr.substr(22, 4));
Bytef* uncompress_buf = new Bytef[uncompressed_data_len];
Bytef* compress_buf = new Bytef[compressed_data_len];
stringstream ss;
ss<<decodedStr.substr(30 + filename_len + ext_len, compressed_data_len);
//decompress
z_stream zInfo ={0};
zInfo.total_in = zInfo.avail_in = compressed_data_len;
zInfo.total_out = zInfo.avail_out = uncompressed_data_len;
zInfo.next_in = compress_buf;
zInfo.next_out = uncompress_buf;

int nErr;
nErr= inflateInit2( &zInfo, 15 ); // zlib function
if ( nErr == Z_OK ) {
nErr= inflate( &zInfo, Z_FINISH ); // zlib function
cout<<nErr<<endl;
}
deflateEnd( &zInfo ); // zlib function
delete uncompress_buf;
...全文
761 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Janos·f 2015-03-25
  • 打赏
  • 举报
回复
我也遇到了这个问题,只是那一段内存地址数据解压出来是正常的

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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