0,废话
最近需要把资源打包到压缩文件并加密,一开始是上网搜索怎么读取加密的ZIP文件的,很遗憾没有搜到读取加密的,只有一些读取没有加密的,于是就想着自己实现,刚开始网上了解了一下,大家都是使用zlib库来实现压缩文件的读取的,因为zlib是跨平台的,我也去下载了zlib库想着自己实现,可把unzip.cpp加入到自己项目后一编译,发现冲突了,咦,cocos2dx已经包含了unzip.cpp了,那为什么不支持加密呢?难道zlib不支持加密的?上网搜了下,原来zlib库被某某某机构下令不准支持加密了,但是加密部分的代码还是在的,所以cocos2dx不支持加密和这个有关吗?既然包含了这个文件,那肯定是支持的呀,上cocos2dx官网看看相关的api,就发现fileUtils类里面有一个getFileDateFromZip()函数读取没有加密的ZIP,然后又去cocos2dx引擎根目录搜索了一下zip,发现还有一个zipUtils类,专门用于zip操作的,但是也没有支持加密的,看来只有自己修改源代码让cocos2dx支持加密了。
先到项目下cocos2dx/cocos/platform文件夹看看CCFileUtils.cpp里面的getFileDataFromZip()函数是怎么实现读取的,它把压缩包里面的文件名参数传给了unzip.cpp里面的unzOpenCurrentFile()函数来打开压缩包里面的文件的,然后我们再去cocos2d/cocos/base文件夹下看看ZipUtils.cpp这个文件,里面有一个ZipFile类,这个类就是专门支持zip操作的,搜索了一下unzOpenCurrentFile()函数,发现一个getFileData()函数,它们的实现代码都差不多,然后我们可以到cocos2d/external/unzip文件夹下找到这个unzip.cpp文件,看看这个函数是怎么读取文件出来的,打开这个文件找到unzOpenCurrentFile()这个函数,惊人的发现,在这个函数下方有一个unzOpenCurrentFilePassword()函数,从名字就可以看出这个是使用密码打开文件,而且它和unzOpenCurrentFile()同样都是调用了unzOpenCurrentFile3()函数,不同的只是最后一个参数,没错,密码!所以只要修改这个函数就OK了,接下来开始动手修改。
1,修改源代码
这里可以修改CCFileUtils.cpp里的getFileDataFromZip()函数,也可以修改ZipUtils.cpp里的getFileData(),
这里我修改的是ZipUtils.cpp,因为这个是专门操作ZIP的。而且后面有不同的用处。
修改很简单,只需要把getFileData()函数改一下参数,和unzOpenCurrentFile()函数就可以了。
先到ZipUtils.h把函数声明加一个参数const char *password,给它一个默认值NULL,这样当你读取没有加密的ZI