Zlib文件压缩和解压

开源代码:http://www.zlib.net/

zlib使用手册:http://www.zlib.net/manual.html

zlib wince版:http://www.tenik.co.jp/~adachi/wince/

在这里,你可以查看基于各种操作系统平台的压缩与解缩代码实现。

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

以下是经过测试的 WinCE 及 WinXP 下的代码

<<<<<<<<

第一步: 首先到http://www.zlib.net/下载个ZLIB,

             WinXP: 解压缩后打开zlib-1.2.3\projects\visualc6\zlib.dsw,选择Win32 LIB Release 按F7编绎生成zlib.lib, zlib.dll.

            WinCE: 下载一个for Windows CE 版的包,里面针对各种平台(ARM4, ARM4I, MIPS, X86)有对应的zlibce.dll zlibce.lib.

<<<<<<<<

第二步: 建立EVC 或者 VS2005 的对话框工程.

             在工程中添加以下文件:zlib.h, zconf.h, zlib.lib, zlib.dll (或者 zlibce.dll);

            这3个文件就在刚才从http://www.zlib.net/下载的软件包中.

<<<<<<<<

第三步: 包含头文件

#include "zlib.h"

主要使用fopen等C标准接口实现的,只用到zlib的Compress()和UnCompress()接口;里面的条件编译是针对PC和WCE的

封装的类:

class CZlib

{

public:

 CZlib();

 ~ CZlib();

 int Compress(char * DestName,const char *SrcName);

 int UnCompress(char * DestName,const char *SrcName);

};

接口实现:

压缩

int CZlib::Compress(char * DestName,const char *SrcName)

{

    ] = {};  //压缩文件时的源buffer



    FILE* fp;  //打开欲压缩文件时文件的指针

    FILE* fp1;  //创建压缩文件时的指针 



    errno_t err; //错误变量的定义

#ifdef WINDOWS_PLATFORM

    err = fopen_s(&fp,SrcName,"r+b");//打开欲压缩的文件

    if(err)

    {

        printf("文件打开失败! \n");

        ;

    }

#endif 

#ifdef    WINDOWS_CE_PLATFORM

    fp = fopen_s(SrcName,"r+b");//打开欲压缩的文件

if(fp)

    {

        printf("文件打开失败! \n");

        ;

    }



#endif 



    

    //获取文件长度

    long cur = ftell(fp);

    fseek(fp,0L,SEEK_END);

    long fileLength = ftell(fp);

    fseek(fp,cur,SEEK_SET);





    //读取文件到buffer

    fread(SourceBuffer,fileLength,,fp);

    fclose(fp);



    //压缩buffer中的数据

    uLongf SourceBufferLen=;

    );

    err=compress((Bytef*)DestBuffer,(uLongf*)&SourceBufferLen,(const Bytef*)SourceBuffer,(uLongf)fileLength);

    if(err!=Z_OK)

    {

        cout<<"压缩失败:"<<err<<endl;

        ;

    }

    

    //创建一个文件用来写入压缩后的数据

    err = fopen_s(&fp1, DestName,"w+b");

    if(!fp1)

    {

        printf("压缩文件创建失败! \n");

         ;

    }



    fwrite(DestBuffer,SourceBufferLen,,fp1);

    fclose(fp1);

    ;

}

解压

int CZlib::UnCompress(char * DestName,const char *SrcName)

{

    ] = {};  //解压缩文件时的源buffer

    FILE* fp3;  //打开欲解压文件的文件指针

    FILE* fp4;  //创建解压文件的文件指针

    errno_t err; //错误变量的定义

    //打开欲解压的文件

    err = fopen_s(&fp3,SrcName,"r+b");

    if(err)

    {

        printf("文件打开失败! \n");

        ;

    }



    //获取欲解压文件的大小

    long ucur = ftell(fp3);

    fseek(fp3,0L,SEEK_END);

    long ufileLength = ftell(fp3);

    fseek(fp3,ucur,SEEK_SET);





    //读取文件到buffer

    fread(uSorceBuffer,ufileLength,,fp3);

    fclose(fp3);



    uLongf uDestBufferLen=;//此处长度需要足够大以容纳解压缩后数据

    );

    //解压缩buffer中的数据

    err=uncompress((Bytef*)uDestBuffer,(uLongf*)&uDestBufferLen,(Bytef*)uSorceBuffer,(uLongf)ufileLength);



    if(err!=Z_OK)

    {

        cout<<"解压缩失败:"<<err<<endl;

        ;

    }



    //创建一个文件用来写入解压缩后的数据

    err = fopen_s(&fp4,DestName,"wb");

    if(err)

    {

        printf("解压缩文件创建失败! \n");

         ;

    }



    printf("写入数据... \n");

    fwrite(uDestBuffer,uDestBufferLen,,fp4);

    fclose(fp4);

    ;

}

测试代码:

test.Compress("1.zip","test.docx");

test.UnCompress("11.docx","1.zip");

上述代码对于大文件就不适合了,因为是一次读出,一次写入的,下面是针对大文件的改进,分批读,分批写,代码如下:

WF_Error CZlib::Compress(const char * DestName,const char *SrcName)

{

    FILE * fp_in = NULL;;];



    WF_Error re = WF_OK;

    

    if( NULL == (fp_in = fopen(SrcName,"rb")))

    {

        return WF_FAIL;

    }



    /////////////////////////////////////////////

    gzFile out = gzopen(DestName,"wb6f");

    

    if(out == NULL)

    {

        return WF_FAIL;

    }



    for(;;)

    {

        len = fread(buf,,sizeof(buf),fp_in);

        

        if(ferror(fp_in))

        {

            re = WF_FAIL;

            break;

        }

        

        ) break;



        if(gzwrite(out, buf, (unsigned)len) != len)

        {

            re = WF_FAIL;

        }

    }



    gzclose(out);



    fclose(fp_in);



    return re;

 }



 WF_Error CZlib::UnCompress(const char * DestName,const char *SrcName)

{

    FILE * fp_out = NULL;WF_Error re = WF_OK;

    

    gzFile ;];



    in = gzopen(SrcName,"rb");



    if(in == NULL)

    {

        return WF_FAIL;

    }



    if(NULL == (fp_out = fopen(DestName,"wb")))

    {

        gzclose(in);

        return WF_FAIL;

    }

    

    for (;;)

    {

        len = gzread(in,buf,sizeof(buf));



        )

        {

            re = WF_FAIL;

            break;

        }



        ) break;



        ,(unsigned)len,fp_out)!=len)

        {

            re = WF_FAIL;

            break;

        }

    }



    fclose(fp_out);

    gzclose(in);



    return re;

}

【神经网络与深度学习】【C/C++】ZLIB学习2的更多相关文章

  1. (转)神经网络和深度学习简史(第一部分):从感知机到BP算法

    深度|神经网络和深度学习简史(第一部分):从感知机到BP算法 2016-01-23 机器之心 来自Andrey Kurenkov 作者:Andrey Kurenkov 机器之心编译出品 参与:chen ...

  2. 【译】神经网络与深度学习 Ch1-Section0

    用神经网络识别手写数字 人类的视觉系统是是大自然的奇迹.考虑下面手写数字序列: 大多数人能够轻易地是识别出是504192.在我们大脑的每个半球都有一个基础的皮质,这就是我们熟知的V1区,它包含了14亿 ...

  3. Neural Networks and Deep Learning(神经网络与深度学习) - 学习笔记

    catalogue . 引言 . 感知器及激活函数 . 代价函数(loss function) . 用梯度下降法来学习-Learning with gradient descent . 用反向传播调整 ...

  4. [DeeplearningAI笔记]神经网络与深度学习人工智能行业大师访谈

    觉得有用的话,欢迎一起讨论相互学习~Follow Me 吴恩达采访Geoffrey Hinton NG:前几十年,你就已经发明了这么多神经网络和深度学习相关的概念,我其实很好奇,在这么多你发明的东西中 ...

  5. Deep Learning.ai学习笔记_第一门课_神经网络和深度学习

    目录 前言 第一周(深度学习引言) 第二周(神经网络的编程基础) 第三周(浅层神经网络) 第四周(深层神经网络) 前言 目标: 掌握神经网络的基本概念, 学习如何建立神经网络(包含一个深度神经网络), ...

  6. 【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第二周测验【中英】

    [中英][吴恩达课后测验]Course 1 - 神经网络和深度学习 - 第二周测验 第2周测验 - 神经网络基础 神经元节点计算什么? [ ]神经元节点先计算激活函数,再计算线性函数(z = Wx + ...

  7. 【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第一周测验【中英】

    [吴恩达课后测验]Course 1 - 神经网络和深度学习 - 第一周测验[中英] 第一周测验 - 深度学习简介 和“AI是新电力”相类似的说法是什么? [  ]AI为我们的家庭和办公室的个人设备供电 ...

  8. 对比《动手学深度学习》 PDF代码+《神经网络与深度学习 》PDF

    随着AlphaGo与李世石大战的落幕,人工智能成为话题焦点.AlphaGo背后的工作原理"深度学习"也跳入大众的视野.什么是深度学习,什么是神经网络,为何一段程序在精密的围棋大赛中 ...

  9. 如何理解归一化(Normalization)对于神经网络(深度学习)的帮助?

    如何理解归一化(Normalization)对于神经网络(深度学习)的帮助? 作者:知乎用户链接:https://www.zhihu.com/question/326034346/answer/730 ...

  10. 【神经网络与深度学习】卷积神经网络(CNN)

    [神经网络与深度学习]卷积神经网络(CNN) 标签:[神经网络与深度学习] 实际上前面已经发布过一次,但是这次重新复习了一下,决定再发博一次. 说明:以后的总结,还应该以我的认识进行总结,这样比较符合 ...

随机推荐

  1. 白话Spring(基础篇)---AOP(execution表达式)(转)

    [一知半解,就是给自己挖坑] 作为AOP的最后一节内容,我们来简单总结一下切面表达式上见的书写方法.下面的那内容有参考其他博文,在此先对开源博客的各位大神表示感谢! ----------------- ...

  2. 【计算机-虚拟wifi】Win7虚拟wifi设置

    虚拟Wifi,可以让电脑变成无线路由器,实现共享上网.   设置步骤 1.以管理员身份运行:cmd.exe   2.启动并设置虚拟网卡:   命令窗口中输入:  netsh wlan set host ...

  3. 【Java Web】IDEA如何创建及配置Web项目(多图)

    正文之前 在学习Java Web时,第一个遇到的问题就是如何创建或配置Web项目了,今天,就用IntelliJ IDEA 来进行Web项目配置: 创建Web项目 配置web项目 正文 创建Web项目 ...

  4. 【原创】时隔十年,再度审视Performance Testing,性能测试,Load Runner,和企业级性能测试解决方案

    软件测试入行是2006年,最先学习的测试工具囊括了QTP,Test Director,Load Runner,Rational Robot,Rational Performance: 那时的操作系统是 ...

  5. 日照学习提高班day4测试

    A 思路: 一看到这个题,他不仅要求输出字典序最小的串,还要满足两两不重复,所以我们可以先输出ababab...什么的,最后缀上要求的k-2种字母 坑点: 当然这样想是不完全的!该题是拥有许多特殊情况 ...

  6. Centos安装成功后配置网络

    一.设置IP地址.网关DNS 说明:CentOS 7.0默认安装好之后是没有自动开启网络连接的! cd /etc/sysconfig/network-scripts/ #进入网络配置文件目录 vi i ...

  7. IDEA如何配置jdk路径

    首先要确定你的jdk已经安装好了 Win + R键,输入cmd 输入java -version 当返回这玩意的时候,就证明你的jdk已经安装成功,可以用IDEA进行配置了 打开IDEA的 File → ...

  8. 邻居子系统 之 更新neigh_update

    概述 neigh_update函数用来更新指定的邻居项,更新内容是硬件地址和状态,更新之后,会根据新状态设置其输出函数,CONNECTED状态则使用快速输出,否则使用慢速输出:如果是由原来的无效状态变 ...

  9. TCP输入 之 tcp_queue_rcv

    tcp_queue_rcv用于将接收到的skb加入到接收队列receive_queue中,首先会调用tcp_try_coalesce进行分段合并到队列中最后一个skb的尝试,若失败则调用__skb_q ...

  10. mybatis延迟加载(Collection)

    上篇讲了assocation,同样我们也可以在一对多关系配置的结点中配置延迟加载策略. 结点中也有 select 属性,column 属性. 需求: 完成加载用户对象时,查询该用户所拥有的账户信息. ...