请教一个关于用zlib解压标准的包含多文件的zip文件的问题.

sonic123 2009-09-29 07:59:44
我想在包含多个文件的zip压缩包(用通用的压缩软件压缩,比如winrar)中提取文件,我分析zip的文件结构后分析出了每个文件对应的压缩后的数据,然后我调用zlib的解压函数,对这些数据分别解压,但是失败.

然后我尝试把压缩包中的文件解压出后,用zlib的压缩函数压缩,发现zlib压缩后的数据比从zip压缩包中读取出的数据的前端多两个字节:0x78 0x9c,然后我尝试从zip压缩包中提取出文件数据后,手动在前面加上这两个字节,然后大多文件就能正确解压了,但部分文件还是不行,请问这是怎么回事?这两个字节是什么意思?如能回答,十分感谢!
...全文
1299 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
anjiao_1989 2012-06-05
  • 打赏
  • 举报
回复
i found
http://stackoverflow.com/questions/1838699/how-can-i-decompress-a-gzip-stream-with-zlib
anjiao_1989 2012-06-05
  • 打赏
  • 举报
回复
i found
http://stackoverflow.com/questions/1838699/how-can-i-decompress-a-gzip-stream-with-zlib
climberlee 2010-05-27
  • 打赏
  • 举报
回复
貌似zlib后面还多了几个字节,晕了,看标准去
hanxiao_0210 2010-01-19
  • 打赏
  • 举报
回复
标记一下,也是读取出zip中的某块压缩数据后,用zlib解压失败,找不到zlib head,返回 Z_DATA_ERROR. compressed method 为 8,应该是deflate压缩方法。暂时还不知道怎样能正确处理。
zentropy 2009-10-08
  • 打赏
  • 举报
回复
(1)类似0x789C是zlib的头标记,包含了压缩方法,压缩附加信息(影响压缩速度,压缩效率等),校验位等
目前真正支持的压缩方法是deflate,其他用于以后可能的扩充
(2)rar和zlib是完全不同的压缩算法,目前比较常见的压缩算法还有lzma,这是7z用的
至于winrar没有压缩,是因为winrar会做一些判断,如果压缩的效率实际不高的话,就不进行压缩

winrar是一种软件,rar是一种算法,winrar实现了rar算法
winzip是一种软件,zlib是一种算法,winzip实现了zlib

(3)想学习压缩相关的话,有耐心可以去下载7z的开源代码阅读
顺便说一句,7z非常强大的,经常看网上有人找chm的反编译程序,其实7z就可以做到
而且7z可以解inno,nsis这种安装包,至于zip,rar都是小case

(4)关于zlib的话网上应该有一个开源库,可以压缩解压,我看过zlib1.2.3,不知道最新版本到哪儿了
(7z不是使用这个库,是自己写的)
rar的话网上只看到一个解压库,unrar,应该也可以找找

两份rfc文档,可以完全明白zlib:
RFC 1950 ZLIB Compressed Data Format Specification version 3.3
RFC 1951 DEFLATE Compressed Data Format Specification version 1.3
sonic123 2009-10-08
  • 打赏
  • 举报
回复
十分感谢~
zentropy 2009-10-08
  • 打赏
  • 举报
回复
zip可能会遇到的主要是下面几个,其他的要不就是预留给以后扩充的,要不就是我个人从未遇到的
0x0000 不压缩,
0x0001 shrunk,
0x0006 implod
0x0008 deflate
0x0009 deflate64
0x000E LZMA
0x0062 PPMd

(1)对于zip包来讲,最常见的肯定还是deflate其他的都比较少见
(2)shrunk和implod,非常非常少会遇到,而且也不是主流的压缩算法
(3)deflate64和lzma在zip中会遇到一些
(4)delfate64是deflate的一个变种,和deflate的区别在于几个常数不同,其他基本一致
上面的那个链接的库目前还不能支持,7zip支持这种变种
(5)lzma是7zip的核心算法。在所有用到压缩的地方,rar/deflate/lzma三者占了绝大部分
7z官网上有lzma的sdk下载,也有很多其他算法的代码,这里提到的这些应该都有
http://www.7-zip.org/
(6)ppmd有多个不同的版本,在zip中非常少会用到
但是rar中借用了ppmd的一些东西,也算是一个比较流行的算法
sonic123 2009-10-08
  • 打赏
  • 举报
回复
十分感谢!受益匪浅!
zip中除了deflate其它的压缩算法用的多?能否给几个关键词?
zentropy 2009-10-08
  • 打赏
  • 举报
回复
zlib的开源库
http://www.zlib.net/

zip格式官方文档
http://www.pkware.com/documents/casestudies/APPNOTE.TXT
zentropy 2009-10-08
  • 打赏
  • 举报
回复
(1)zip中实际中支持很多压缩算法,deflate只是他最核心的
所以你必须保证这段数据是deflate压缩的,否则用zlib库来解是没有意义的

具体方法:
参考你上面给的那个链接,其中有一个部分是"压缩方式 2bytes"
如果这个部分在文件中是0x0800(也就是值实际是0x0008),那么就是deflate,可以用你说的方法来解

还要注意的一点是,保证是没有加密的

(2)zip实质的压缩算法是deflate,而不是zlib
简单来讲,zlib比deflate多封了那2个字节(真正区别可以参考上面两个rfc文档)
且这2个字节对解压没有任何帮助
sonic123 2009-10-08
  • 打赏
  • 举报
回复
很感谢前辈!我就是想自己解压标准的zip压缩包(winrar或winzip压缩的,不考虑rar格式),我现在的思路是按下面这个文档自己读取出zip包中每个文件压缩后的数据,然后用zlib库解压,请问这个方法可行吗?现在遇到的困难就是在保准zip压缩包中读取出的压缩后的数据好像没有带zlib的头标记,不能准确知道每段压缩数据的压缩参数.

我参考的资料:
http://hi.baidu.com/qq520131714/blog/item/b671ca1f2e831dfde1fe0b35.html
sonic123 2009-09-29
  • 打赏
  • 举报
回复
十分感谢!请问这样的情况怎么处理比较妥当?另外我发现如果要压缩的文件内容只有"abc"三个字符,那么用winrar压缩后还会保持原状,但用zlib就会真的压缩,是压缩算法不同,还是winrar对较少的数据会不压缩?能否给些资料什么的?很是感谢!先谢了.
PeacefulBY 2009-09-29
  • 打赏
  • 举报
回复
标准zlib压缩过的数据块会以这两个字节开头,表明它是以算法的默认设置压缩的
另外,0x78 0xDA也很常见,跟前面一样不过采用的是最高压缩级别

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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