采用ZLIB及MINIZIP进行文件解压缩及加解密

分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net

ZLIB开源库采用的是DEFLATE压缩算法,已经不支持加密功能,实际上功能还存在于代码中,采用MINIZIP可以支持对ZIP文件的加解密。
 
ZLIB目前最新的是1. 2 .7,MINIZIP最新的版本是1.1。
 
采用ZLIB可以解压缩任何ZIP文件,也可以压缩成ZIP文件被WINZIP/WINRAR/7Z等工具打开。
注意:如果采用了加密功能,ZLIB加密的文件只能被ZLIB解开,WINRAR/WINZIP打不开,7Z可以打开,但其它工具加密的ZIP文件ZLIB可以打开,令人费解,
长期不支持加密失去维护造成的。
注:已经确认调用
zipOpenNewFileInZip4前需要用 crc32函数计算文件CRC值,当做参数传入函数即可,具体代码参照minizip.c文件。
 
采用MINIZIP进行文件压缩:
如果要支持加密,需要屏蔽unzip.c中的NOUNCRYPT宏定义。
 
创建压缩流
zipFile zf=
NULL ;
zf = zipOpen64(zipFile,
0 );
 
压缩文件
zip_fileinfo FileInfo; 
ZeroMemory(&FileInfo, 
sizeof (FileInfo));               
zipOpenNewFileInZip4(zf,buf, &FileInfo, 
NULL 0 NULL 0 NULL , Z_DEFLATED,level, 0 , -MAX_WBITS, DEF_MEM_LEVEL, 
Z_DEFAULT_STRATEGY,password, 
0 0 , ZIP_GPBF_LANGUAGE_ENCODING_FLAG);
注意buf为文件名,password为空时需要给NULL,level为压缩比,9为最高,0最低。

写入压缩文件
zipWriteInFileInZip(zf,data,size)

关闭当前文件
zipCloseFileInZip(zf);
 
关闭流
zipClose(zf,
0 );
 
采用MINIZIP进行文件解压缩:
 
unzFile uf=
NULL ;
unz_global_info64 gi;
unz_file_info64 FileInfo;  
 
打开zip文件
 
uf = unzOpen64(szZipFile);
result=unzGetGlobalInfo64(uf, &gi);

if  (result != UNZ_OK)          
    
throw  “文件错误”;
 
循环解压缩文件
 

for ( int  i= 0 ;i<gi.number_entry;++i)
{

if  (unzGetCurrentFileInfo64(uf, &FileInfo,file, sizeof (file), NULL , 0 , NULL , 0 )!= UNZ_OK)
     
throw  “文件错误”;
 

if (!(FileInfo.external_fa & FILE_ATTRIBUTE_DIRECTORY))  //文件,否则为目录
 
//打开文件
 result=unzOpenCurrentFile(uf); /* 无密码 */
result=unzOpenCurrentFilePassword(uf,szPassword);  /* 有密码 */
  
//读取内容
size= unzReadCurrentFile(uf,data,size);                    
 

//关闭当前文件
unzCloseCurrentFile(uf);   
 

//出错
if (i < gi.number_entry -  1  && unzGoToNextFile(uf) != UNZ_OK)
  
throw  “error”;
        
}
 
关闭流
unzClose(uf);

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net

猜你喜欢

转载自www.cnblogs.com/sjwudhwhhw/p/10509961.html
今日推荐