zoukankan      html  css  js  c++  java
  • 采用ZLIB及MINIZIP进行文件解压缩及加解密

    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, 
    NULL0NULL0NULL, Z_DEFLATED,level,0, -MAX_WBITS, DEF_MEM_LEVEL, 
    Z_DEFAULT_STRATEGY,password, 
    00, 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);
  • 相关阅读:
    Scala Ant Tasks
    Git挂钩
    读写文件
    DC10用CSS定位控制网页布局
    table设置colspan属性,列宽显示错位解决方法
    ATM和购物商城-错题集
    python 函数参数多种传递方法
    python 函数 初学
    python 集合 gather
    元组 字体高亮 购物车练习
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318267.html
Copyright © 2011-2022 走看看