对Zlib单元进行再封装

低版本DELPHI,如D7,ZLIB.pas单元封装的很简陋,因此有必要再封装,以增加使用的便利性。

高版本DELPHI,zlib.pas本身提供的接口已经相当完善。

Zlib.pas是DELPHI自带的压缩单元,下面对对Zlib单元进行再封装,增加两个压缩函数,一个压缩流,一个压缩字符串:

分别在D7和XE10.3.1下面,测试通过。

  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. ZLib, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
  7. Forms, Dialogs;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. private
  12. { Private declarations }
  13. public
  14. { Public declarations }
  15. end;
  16.  
  17. var
  18. Form1: TForm1;
  19. // 两个过程都有Compress参数,这个参数用来决定进行压缩操作还是解压操作: True--压缩; false--解压.
  20. procedure Zip(Input, Output: TStream; Compress: Boolean); overload;
  21.  
  22. function Zip(Input: string; Compress: Boolean): string; overload;
  23.  
  24. implementation
  25.  
  26. {$R *.dfm}
  27.  
  28. procedure Zip(Input, Output: TStream; Compress: Boolean);
  29. const
  30. MAXBUFSIZE = 1024 * 16; //16 KB
  31. var
  32. CS: TCompressionStream;
  33. DS: TDecompressionStream;
  34. Buf: array[0..MAXBUFSIZE - 1] of Byte;
  35. BufSize: Integer;
  36. begin
  37. if Assigned(Input) and Assigned(Output) then
  38. begin
  39. if Compress then // 压缩
  40. begin
  41. CS := TCompressionStream.Create(ZLib.clDefault, Output);
  42. try
  43. CS.CopyFrom(Input, 0); //从开始处复制
  44. finally
  45. CS.Free;
  46. end;
  47. end
  48. else
  49. begin // 解压
  50. DS := TDecompressionStream.Create(Input);
  51. try
  52. BufSize := DS.Read(Buf, MAXBUFSIZE);
  53. while BufSize > 0 do
  54. begin
  55. Output.Write(Buf, BufSize);
  56. BufSize := DS.Read(Buf, MAXBUFSIZE);
  57. end;
  58. finally
  59. DS.Free;
  60. end;
  61. end;
  62. end;
  63. end;
  64.  
  65. function Zip(Input: string; Compress: Boolean): string;
  66. var
  67. InputStream, OutputStream: TStringStream;
  68. begin
  69. if Input = '' then
  70. Exit;
  71. InputStream := TStringStream.Create(Input);
  72. try
  73. OutputStream := TStringStream.Create('');
  74. try
  75. Zip(InputStream, OutputStream, Compress);
  76. Result := OutputStream.DataString;
  77. finally
  78. OutputStream.Free;
  79. end;
  80. finally
  81. InputStream.Free;
  82. end;
  83. end;
  84.  
  85. end.

  

对Zlib单元进行再封装的更多相关文章

  1. iOS开发之网络请求(基于AFNetworking的再封装)

    最近一直很忙也没有什么时间写博客了.放假了休息一下,就写一篇博客来总结一下最近做项目中出现过的问题吧!!! 首先,在项目中我的起到了什么作用,无非就是把美工(UI设计师)给我们的图显示出来,然后再和服 ...

  2. 打印 Logger 日志时,需不需要再封装一下工具类?

    在开发过程中,打印日志是必不可少的,因为日志关乎于应用的问题排查.应用监控等.现在打印日志一般都是使用 slf4j,因为使用日志门面,有助于打印方式统一,即使后面更换日志框架,也非常方便.在 < ...

  3. RecyclerView再封装

    RecyclerView做为ListView的替代品,已经出了很久了,既然是替代品,那自然有些ListView没有的优点.比如说:可以随意切换list,grid,stagger.可以指定一个或多个it ...

  4. c# AutoMapper 使用方式和再封装

    安装方式:使用vs自带的nuget管理工具,搜索AutoMapper ,选择第一个安装到你的项目即可. 我从网上找了一些资料, 参考网址:http://blog.csdn.net/csethcrm/a ...

  5. mvc中使用Pagination,对其进行再封装

    对其进行再次封装: (function($) { $["fn"]["easyPaging"] = function(o) { if (!o.pageSelect ...

  6. 对Jquery中的ajax再封装,简化操作

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. phpmailer类的再封装

    email <?php use PHPMailer\PHPMailer\PHPMailer; class Email { const SMTPDebug = 2; const HOST = 's ...

  8. Http客户端再封装

    Android系统上推荐的Http客户端从Apache变成[HttpURLConnection],主要理由包括 * 不过因为UrlConnection这组接口时间较早(Java 1.0), 接口的设计 ...

  9. Delphi Base64编码/解码及ZLib压缩/解压

    最近在写的程序与SOAP相关,所以用到了一些Base64编码/解码及数据压缩/解压方面的知识. 在这里来作一些总结:   一.Base64编码/解码   一般用到的是Delphi自带的单元EncdDe ...

随机推荐

  1. 前端框架开始学习Vue(三)

    初步安装.与搭建    https://www.cnblogs.com/yanxulan/p/8978732.html ----如何搭建一个vue项目 安装 nodejs,,, npm i == np ...

  2. jquery中的ajax方法(备忘)

    参考:https://www.cnblogs.com/tylerdonet/p/3520862.html w3school:http://www.w3school.com.cn/jquery/ajax ...

  3. 数组中的reduce

    reduce方法第一次对我的感觉是很鸡肋,但是深入了解,才发现其中的奥妙,是个非常强大且实用的方法 var arr = [1,2,3,4,5,6,7]; var sum = arr.reduce( ( ...

  4. Maven配置环境变量

    Windows: 1:新建系统M2_HOME变量,并把安装maven路径拷贝上去 ​ 2:配置path变量,并把maven路径拷贝上去,这次的maven路径到bin ​ 3:测试maven环境是否配置 ...

  5. java学习(1) ----getMethod()和getDeclaredMethod()的区别(转)

    转自: https://blog.csdn.net/qq_36443736/article/details/82890011 getMethod():获取自身能用所有的public公共方法.1.类本身 ...

  6. 关于strlen和sizeof的使用

    在学习C语言中发现strlen和sizeof的关系不是很明确,今天来总结一下这两个的区别: sizeof 是运算符,用来计算字节数,在计算字符串数组大小时包含(\0) 在编译时计算大小,参数可以是数组 ...

  7. 常考JS题笔记

    ### 1. 原始类型有哪几种?null 是对象吗? 答: Null,undefined,Number,String,Blooean,symbol1)[理解和使用ES6中的Symbol][https: ...

  8. Git---报错:git Please move or remove them before you can merge 解决方案

    场景: 当前在本地仓库lucky,因修改了123.txt的文件内容,需要将lucky分支push到远程Git库,在push前有其他的同事已删除了远程Git库中的123.txt文件.因此这时就产生了远程 ...

  9. 16Vue 表单的输入绑定

    基础用法 你可以用 v-model 指令在表单 <input>.<textarea> 及 <select> 元素上创建双向数据绑定. 它会根据控件类型自动选取正确的 ...

  10. 自定义简单算法MVC框架

    什么是MVC框架 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,   它是一种软件设计典范,用一种业务逻辑.数据 ...