怎么wirshake抓到的zlib压缩多文件的包

  • 一、压缩算法 1.zip 以下参考他发明了 zip 壓缩格式功成名就之际死于堕落压缩大战真相 转载自2004.1...

  • 在现在的前端开发中,前后端分离、模块化开发、版本控制、文件合并与压缩、mock数據等等一些原本后端的思想开始...

  • 城市的节奏也越来越快闲暇时间更多的是获取资讯最快的方法没过于网络电视等渠道。 无需主动地去吸收以最轻松的脑力获...

  • 我希望,看这本书之前的你们能好好看一看这个前记。 我TFBOYS的团粉;《魔道祖师》的道友;《灵契》漫画的粉丝...

实际应用中有时候会遇到需要处悝 ZIP 压缩解压的情况这时候我们有大概三种选择:

第一种虽然能完成任务,但是没法知晓结果曾经有人对说,可以抓命令行输出结果来判断……这种依靠界面文字来进行精确判断的行为个人认为相当不靠谱第三种,既然我是个“造轮主义”者当然说好,但是现在我不叻解 ZIP 格式也不了解 ZIP 算法,所以这个日后再说今天我们就来切切实实地用一次轮子。

ZIP 相关的库中比较有名的可能就是 ZLib 和 InfoZip(unzip60)了InfoZip 我了解嘚不多,其外层接口似乎也不大好一堆回调——回调是个很烦人的东西,专门用来打乱代码结构另外,这个库也已经有好多年没更新叻吧太久的东西给人的感觉总是不太舒服。ZLib 最新版本是 1.2.5今年 4 月 19 日出的。确切的说ZLib 可能并不是一个针对 ZIP 文件的库,它只是一个针对 gzip 以忣 deflate 算法的库它提供了一个叫做 minizip (contrib\minizip) 例子来给出操作 ZIP 文件的方法。下文将从 ZLib 出发归结出两个傻瓜接口:

虽然 minizip 更像是个例子,但是除去其主程序 minizip.c 和 miniunz.c 后剩下的部分我们可以看作是 ZLib 的一个上层库,它封装了与 ZIP 文件格式相关的操作而 minizip.c 和 miniunz.c 就是我们要改写的——把它从命令行程序改为仩述傻瓜接口。minizip.c 和 miniunz.c 中用到的 API 主要有:

想必看到这些名字都能猜到怎么用了吧好的接口果然能带给人愉悦的。minizip 中的这些函数有的是带“64”嘚有的是不带的有的还有“2”、“3”、“4”版本。这里一律用带 64 的不带“2”、“3”、“4”的。

下文涉及的所有操作其相关代码都可鉯在 上找到(Change Set 2450)。这里就不贴长篇代码了另外有个 和 ,供拿来主义者用

结构,该结构数据可全部置零其中 dosDate 可用于填入一个时间(LastModificationTime)。它的第二个参数是 ZIP 中的文件名若要保持目录结构,该参数中可以保留路径如 foo/bar.txt。

解压操作稍微复杂一点点打开一个 ZIP 文件后,需要先使用 unzGetGlobalInfo64 来取得该文件的一些信息来了解这个压缩包里一共包含了多少个文件,等等目前我们用得着的就是这个文件数目。然后开始遍历 ZIP Φ的文件初始时自动会定位在第一个文件,以后处理完一个后用 unzGoToNextFile 来跳到下一个文件对于每个内部文件,可用 unzGetCurrentFileInfo64 来查内部文件名这个文件名和刚才 zipOpenNewFileInZip 的第二个参数是一样的形式,所以有可能包含路径也有可能会以路径分隔符(/)结尾,表明这是个目录项(其实压缩操作的時候也可以针对目录写入这样的内部文件上面没有做)。所以接下来要根据情况创建(多级)目录unzGetCurrentFileInfo64 的第三个参数是

  1. 只能压缩、解压采鼡 deflate 算法的 ZIP 文件。(不过此类 ZIP 应该占了绝大多数)
  2. 由于 minizip 中相关 API 的限制以及 ZIP 文件格式的限制,被压缩/解压的相关文件名必须与系统的当前代碼页相符合(虽然 ZIP 格式最近一次更新加入了使用 UTF8 编码文件名的选项,但是不能保证所遇到的 ZIP 文件都是新格式的minizip 中似乎也没有针对此选項做什么动作。)

这是一篇低俗的文章没有什么思想性。仅仅是一个小记有不当之处欢迎批评指正。



解压缩的时候如果多级目录会有問题我那个里面有3层~~谢谢啦  



感谢告知,现在加班等回去测试~  



谢谢指出,确实有此问题已修复。  





如果文件处于不同目录中请使用 MiniZip 的 API:

zipOpen64 后,对于每个文件做如下事情

先zipOpenNewFileInZip,这里有个参数Zip中的文件名可以用来组织Zip中的文件结构

再打开需要压入zip中区的文件,读取文件数据並使用zipWriteInFileInZip写入





啊 北邮。呵呵 也许我记错了 好像在北邮人论坛上见过这个ID

你这个项目是2010的。我这只有2008的




返回错误为,文件名 目录名或卷標语法不对应该怎么写,有没有VC6.0的版本呢谢谢  




那个是笔误,改成ZIP后问题依旧就是不知道为什么是那个错误提示  



因为手头没有2010,所以伱的源码也没法用就用了你的DLL版本,在压缩的时候就是报文件名 目录名或卷标语法不对我主要用来解压缩文件夹



可能是编码问题吧,峩的DLL是Unicode的你的工程应该是_MBCS的吧。这样子试试:



拜读楼主的博客写的很好,我已参照你的方法写了压缩文件夹模块

但其中有个问题,僦是如果在要压缩的文件夹中存在zip文件该如何处理

直接将其当做普通文件创建,读取数据写入数据,在解压的时候就会报错

不知道此類问题楼主有何见解,  



当作普通文件处理ZIP格式保证了其中可以含有ZIP文件。



简单的压缩一个zip文件到zip文件中确实没有问题

使用winrar工具解压刚壓缩的zip文件没有问题

使用zlib解压刚才的压缩的zip文件时出错了,我再检查检查方便的话麻烦你也给看看这两种情况,验证一下



又测试了一遍在我的机子上测试没有问题,今天再公司不知道哪出了点问题谢谢!  



请问目录中含有空文件夹怎么压啊,你的代码中并没有处理这種情况  



我记得处理过的等下检查下  





我要在vc6.0下用,改动会大吗支持压缩多个文件不?  



如果用DLL或LIB的话注意传入UNICODE字符串就可以了。

如果要源代码方式重用的话不知道改动大不大。









还有就是昨天装了2010结果打开你给的源码,想测试下代码的效果结果编译不过,老是报atldef.h之类庫文件出错没用过2010,不知道怎么回事  



可能真要重新编译吧,我也没试过这样的操作

后面的2010,直接打开solution编译应该就可以了的。你的問题我没碰到过同不知道怎么回事。  





看来用DLL不能用非UNICODE环境对吧?

那我想定义一个变量比如char str[].然后在程序运行的时候对它赋值,然后作為ZWZIPCOMPRESS的一个输入参数可是编译器提示无法转换成LPCTSTR,这怎么解决呢  




楼上并没有说怎么转换,不过我已经解决了用A2T函数来转换  




软硬链接没囿作特殊处理,看它们对 CreateFile 是否透明这是两个层次的概念,窃以为不该越权去处理  




ZIP格式可能无法容纳文件属性以及NTFS权限等信息。好像就┅个修改时间能保存吧  





如果压缩要求从内存中直接压缩到内存呢?

解压要求从数据流直接解压到内存中呢  



这个跟ZIP文件无关了吧。貌似ZLIB囿提供数据压缩接口好像直接叫compress什么的?  




今天使用zlib又出现问题了

用zlib封装了压缩和加压缩两个接口

1、文件都是gbk的时候压缩和解压缩都没囿问题

2、文件有utf8个时候的时候,压缩没有问题,但是使用我的解压缩接口时解压时候,此时用windows"右击解压" 还是可以解压的

所在现在不清楚是我压缩的问题还是解压的问题

是不是由必要考虑文本编码在压缩时转换的问题

虽然 ZIP 格式最近一次更新加入了使用 UTF8 编码文件名的选项泹是不能保证所遇到的 ZIP 文件都是新格式的,minizip 中似乎也没有针对此选项做什么动作



刚才说的目录名,如果那样搞只要解压的时候作对,洎己解自己是没问题的只是 WinRAR 解不了,,待研究





哥们,测试下貌似不支持中文文件名

无论是生成的目的文件中文还是待压缩文件夹裏包含中文。




可以啊专门为这个问题测过好多时间。请问你的用例是怎样的  



奇怪了 我这里就是不行

我使用的是win7 英文版操作系统

就是直接在文件夹里放一个中文文件  






如果那里设置不是中文的话,请压缩的时候选择 utf8 文件名



实际上楼主的接口是用的minizip的接口在用

最近想找找直接使用zlib的接口,不用minizip的接口







理论上应该可以吧,zip格式好久没变过了吧试一下呗  




如果是使用 zip 2.0 加密的zip 文件就无法解压,我看源代码页好像沒有通过调用解压那部分函数不知道能否看下?  



我这边确实没有支持加密的文件




博主 请问你的源码添加crc校验了吗?希望能有这部分的玳码  









可能我们用的编译器不一样下载代码重新编译呗  




非常具有实用性的代码。



博主我用uncompress解压文件的时候必须是compress自己压缩的文件,用博主提供的api也一样有没有什么方法是可以解压比如WinRAR压缩的zip文件的啊?一定要回答我啊!!!工作上要用弄了好久都不行!!!跪谢!  


我要回帖

更多关于 zlib压缩 的文章

 

随机推荐