zoukankan      html  css  js  c++  java
  • BCB6 使用TZCompressionStream压缩

     
        最近由于项目需要涉及到解压第三方公司的数据,在此做一下记录环境部署和使用方法,免得以后忘记。
        对方公司的数据是通过TCompressionStream 压缩之后,存到数据库中,采用的delphi7.起初以为直接用TCompressionStream就能搞定,实际发现BCB 没有这个东西。需要另外部署。

        上网搜索之后,发现本质是一个叫zlib的库。

        我用的是 1.2.3版本,下载地址 http://www.base2ti.com/?id=delphi.zlib
    关于zlib的说明  http://www.zlib.net/ ; ,大致喵了一下 是 霍夫曼编码 啥的,后面再一点点仔细研究。

    1、编译DelphiZLib.bpr 
         1.2.3版本解压之后得到 DelphiZLib.bpr 工程, 用BCB6编译这个工程
    本质上就是编译那些*.c 文件得到 *.obj 文件 和 delphizlib.lib

    2、编译ZLibEx.pas
         bcb6新建一个lib 工程,将zlibEx.pas  通过project->Add 添加到工程,build即可,我边编译的时候报错了,发现是这个pas文件中
    不知道为啥有 “锘縶*********************************”  这样的乱码,将乱码改成 “{******”  (老实说delphi用 {表示注释 我不能理解) 即可。
         得到 ZLibEx.hpp

    3、编译ZLibExGZ.pas
         与编译ZLibEx.pas同样的方法,得到ZLibExGZ.hpp

    4、添加到运行环境
         网上很多人喜欢吧 库文件一股脑的拷贝到 borland 安装目录的lib文件夹下面,这么做因为BCB工程默认会 引用 $(BCB)include 
    $(BCB)includeVCL  (类似JAVA里面部署环境变量,总之就是要当前工程能够找到引用的lib  obj  pas  cpp 这些库文件) 
         我是单独引用或在程序中带上三方的lib(仅仅是个人喜好,不喜欢混一块)。比如 D:zlib  下面放了编译出来的lib  obj  hpp  pas 这些文件 ,那么 optiontion->directorescontains
    include path 和 lib path  引用D:LIB

    5、添加lib,obj
    将d:zilib  的 lib 和 obj 复制到到 当前工程下面, 比如 D:projectzlib 文件夹里面
    然后通过 project->add
    吧lib 和 obj 都引用过去,否则报 无法引用xxxx之类的错误。

    6、使用
    在工程代码中
    #include "ZLibEx.hpp"
    即可使用 
    //压缩流
    TZCompressionStream  
    //解压流
    TZDecompressionStream


    7、例子
    这些例子是看人家delphi 自己翻译过来,又调整了下,保证能运行。前提是程序目录下有 s.bmp文件
     
    //压缩的例子 
    void __fastcall TForm1::btn3Click(TObject *Sender)
    {
        TMemoryStream *fs = new TMemoryStream();
        fs->LoadFromFile("s.bmp");
        int fsize = 0;
        fsize = fs->Size;

        TMemoryStream *ms = new TMemoryStream();
        ms->Write(&fsize,sizeof(fsize));

        //构造时1参数为目标流 、2参数为压缩等级,这里选最快
        //enum TZCompressionLevel { zcNone, zcFastest, zcDefault, zcMax, zcLevel1, zcLevel2, zcLevel3, zcLevel4, zcLevel5, zcLevel6, zcLevel7, zcLevel8, zcLevel9 };
        TZCompressionStream *cs = new  TZCompressionStream(ms,zcFastest);
        //输入文件流
        fs->SaveToStream(cs);

        //压缩完毕保存压缩文件
        ms->SaveToFile("test.crp");

        delete fs;
        delete cs;
        delete ms;
    }

    //解压上面产生的 test.crp

    void __fastcall TForm1::btn2Click(TObject *Sender)
    {

        TMemoryStream *fs = new TMemoryStream();
        fs->LoadFromFile("test.crp");
        fs->Position = 0;
        int fsize = 0;
        //此方法可以得到解压之后的大小
        fs->ReadBuffer(&fsize,sizeof(fsize));

        TMemoryStream* ms = new TMemoryStream();
        ms->SetSize(fsize);

        TZDecompressionStream* ds = new TZDecompressionStream(fs);
        //解压后输入到ms流
        ds->Read(ms->Memory,fsize);

        ms->SaveToFile("ok.bmp");

        delete ms;
        delete ds;
        delete fs;

  • 相关阅读:
    宽带手记
    adb的logcat使用
    项目经理
    小A老空调需求管理小记
    作为一个项目经理你关注的是什么
    技术采撷
    项目的落地目标
    和我一起使用postcss+gulp进行vw单位的移动端的适配
    高级程序设计第十三章,简单的事件捕获事件冒泡整理
    javascript高级程序设计第二章知识点提炼
  • 原文地址:https://www.cnblogs.com/songr/p/6351422.html
Copyright © 2011-2022 走看看