对Zlib单元进行再封装
对Zlib单元进行再封装
低版本DELPHI,如D7,ZLIB.pas单元封装的很简陋,因此有必要再封装,以增加使用的便利性。
高版本DELPHI,zlib.pas本身提供的接口已经相当完善。
Zlib.pas是DELPHI自带的压缩单元,下面对对Zlib单元进行再封装,增加两个压缩函数,一个压缩流,一个压缩字符串:
分别在D7和XE10.3.1下面,测试通过。
unit Unit1; interface uses
ZLib, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms, Dialogs; type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1;
// 两个过程都有Compress参数,这个参数用来决定进行压缩操作还是解压操作: True--压缩; false--解压.
procedure Zip(Input, Output: TStream; Compress: Boolean); overload; function Zip(Input: string; Compress: Boolean): string; overload; implementation {$R *.dfm} procedure Zip(Input, Output: TStream; Compress: Boolean);
const
MAXBUFSIZE = 1024 * 16; //16 KB
var
CS: TCompressionStream;
DS: TDecompressionStream;
Buf: array[0..MAXBUFSIZE - 1] of Byte;
BufSize: Integer;
begin
if Assigned(Input) and Assigned(Output) then
begin
if Compress then // 压缩
begin
CS := TCompressionStream.Create(ZLib.clDefault, Output);
try
CS.CopyFrom(Input, 0); //从开始处复制
finally
CS.Free;
end;
end
else
begin // 解压
DS := TDecompressionStream.Create(Input);
try
BufSize := DS.Read(Buf, MAXBUFSIZE);
while BufSize > 0 do
begin
Output.Write(Buf, BufSize);
BufSize := DS.Read(Buf, MAXBUFSIZE);
end;
finally
DS.Free;
end;
end;
end;
end; function Zip(Input: string; Compress: Boolean): string;
var
InputStream, OutputStream: TStringStream;
begin
if Input = '' then
Exit;
InputStream := TStringStream.Create(Input);
try
OutputStream := TStringStream.Create('');
try
Zip(InputStream, OutputStream, Compress);
Result := OutputStream.DataString;
finally
OutputStream.Free;
end;
finally
InputStream.Free;
end;
end; end.
对Zlib单元进行再封装的更多相关文章
- iOS开发之网络请求(基于AFNetworking的再封装)
最近一直很忙也没有什么时间写博客了.放假了休息一下,就写一篇博客来总结一下最近做项目中出现过的问题吧!!! 首先,在项目中我的起到了什么作用,无非就是把美工(UI设计师)给我们的图显示出来,然后再和服 ...
- 打印 Logger 日志时,需不需要再封装一下工具类?
在开发过程中,打印日志是必不可少的,因为日志关乎于应用的问题排查.应用监控等.现在打印日志一般都是使用 slf4j,因为使用日志门面,有助于打印方式统一,即使后面更换日志框架,也非常方便.在 < ...
- RecyclerView再封装
RecyclerView做为ListView的替代品,已经出了很久了,既然是替代品,那自然有些ListView没有的优点.比如说:可以随意切换list,grid,stagger.可以指定一个或多个it ...
- c# AutoMapper 使用方式和再封装
安装方式:使用vs自带的nuget管理工具,搜索AutoMapper ,选择第一个安装到你的项目即可. 我从网上找了一些资料, 参考网址:http://blog.csdn.net/csethcrm/a ...
- mvc中使用Pagination,对其进行再封装
对其进行再次封装: (function($) { $["fn"]["easyPaging"] = function(o) { if (!o.pageSelect ...
- 对Jquery中的ajax再封装,简化操作
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- phpmailer类的再封装
email <?php use PHPMailer\PHPMailer\PHPMailer; class Email { const SMTPDebug = 2; const HOST = 's ...
- Http客户端再封装
Android系统上推荐的Http客户端从Apache变成[HttpURLConnection],主要理由包括 * 不过因为UrlConnection这组接口时间较早(Java 1.0), 接口的设计 ...
- Delphi Base64编码/解码及ZLib压缩/解压
最近在写的程序与SOAP相关,所以用到了一些Base64编码/解码及数据压缩/解压方面的知识. 在这里来作一些总结: 一.Base64编码/解码 一般用到的是Delphi自带的单元EncdDe ...
随机推荐
- node.js 调用mysql 数据库
1.在package.json中添加mysql依赖 命令:npm install mysql --save 2.项目中添加mysql文件夹 > 文件夹下创建config文件夹,并在config下 ...
- 六、select查询基础篇
前言: DQL(Data QueryLanguage):数据查询语言,通俗点讲就是从数据库获取数据的,按照DQL的语法给数据库发送一条指令,数据库将按需求返回数据. 一.基本语法 select 查询的 ...
- 详解介绍Selenium常用API的使用--Java语言(完整版)
参考:http://www.testclass.net/selenium_java/ 一共分为二十个部分:环境安装之Java.环境安装之IntelliJ IDEA.环境安装之selenium.sele ...
- oracle concepts学习
祭图一张!!!
- Zabbix监控平台-----深入理解zabbix
一,Zabbix Web操作深入 (1)创建一个模版,所有的功能几乎都是在模版中定义的 点进新创建的模版查看,模版里几乎可以设定我们需要的所有功能 (2)在模版里创建应用集,应用集的作用就是将众多的监 ...
- web server
嵌入式的:boa thttpd wn 网站的: iis apache tomcat ngnix python 的 ruby的 自定的 windows w3mfc c#自定义的1对1 webser ...
- 【原创】SPFA判负环
[定义与概念] 给定一张有向图,若其中存在一个环的所有权值之和为负数,这个环称为负环. [算法实现] 当然,负环的求解可以暴搜,但是时间复杂度就难以入眼了,我们回到求解单源最短路径算法上面,看看它们能 ...
- go语言的内建变量类型
string bool int int8 int16 int32 int64 uintptr 无符号int 类型 (u)int (u)int8 (u)int16 (u)int32 (u)int ...
- python - orm 字段
1.models.AutoField 自增列 = int(11) 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True. ...
- The database principal owns a schema in the database, and cannot be dropped. (.Net SqlClient Data Pr
解决microsoft sql server error:15138的方法 http://blog.csdn.net/gray13/article/details/4458523 用sp_change ...