最近由于项目需要涉及到解压第三方公司的数据,在此做一下记录环境部署和使用方法,免得以后忘记。
对方公司的数据是通过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;
}
对方公司的数据是通过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;
}