最近由于项目需要涉及到解压第三方公司的数据,在此做一下记录环境部署和使用方法,免得以后忘记。
    对方公司的数据是通过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)\include\VCL  (类似JAVA里面部署环境变量,总之就是要当前工程能够找到引用的lib  obj  pas  cpp 这些库文件) 
     我是单独引用或在程序中带上三方的lib(仅仅是个人喜好,不喜欢混一块)。比如 D:\zlib  下面放了编译出来的lib  obj  hpp  pas 这些文件 ,那么 optiontion->directores\contains
include path 和 lib path  引用D:\ZLIB

5、添加lib,obj
将d:\zilib  的 lib 和 obj 复制到到 当前工程下面, 比如 D:\project\zlib 文件夹里面
然后通过 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;

posted on 2017-01-26 11:33  zooz  阅读(1155)  评论(0编辑  收藏  举报