2
0

Quick.Compression.pas 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. { ***************************************************************************
  2. Copyright (c) 2016-2019 Kike Pérez
  3. Unit : Quick.Compression
  4. Description : Compression functions
  5. Author : Kike Pérez
  6. Version : 1.2
  7. Created : 14/08/2018
  8. Modified : 05/09/2019
  9. This file is part of QuickLib: https://github.com/exilon/QuickLib
  10. ***************************************************************************
  11. Licensed under the Apache License, Version 2.0 (the "License");
  12. you may not use this file except in compliance with the License.
  13. You may obtain a copy of the License at
  14. http://www.apache.org/licenses/LICENSE-2.0
  15. Unless required by applicable law or agreed to in writing, software
  16. distributed under the License is distributed on an "AS IS" BASIS,
  17. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18. See the License for the specific language governing permissions and
  19. limitations under the License.
  20. *************************************************************************** }
  21. unit Quick.Compression;
  22. {$i QuickLib.inc}
  23. interface
  24. uses
  25. Classes,
  26. SysUtils,
  27. ZLib,
  28. System.NetEncoding;
  29. type
  30. TCompressionLevel = TZCompressionLevel;
  31. function CompressString_Deprecated(const aStr : string; aCompressionLevel : TCompressionLevel = zcDefault) : string;
  32. function DecompressString_Deprecated(const aStr: string) : string;
  33. function CompressString(const aStr : string; aCompressionLevel : TCompressionLevel = zcDefault) : string;
  34. function DecompressString(const aStr: string) : string;
  35. function CompressGZipString(const aStr : string; aCompressionLevel : TCompressionLevel = zcDefault) : string;
  36. function DecompressGZipString(const aStr: string) : string;
  37. function CompressAndEncodeString(const aStr: string; aCompressionLevel : TCompressionLevel = zcDefault): string;
  38. function DecodeAndDecompressString(const aStr: string): string;
  39. implementation
  40. function CompressString_Deprecated(const aStr : string; aCompressionLevel : TCompressionLevel = zcDefault) : string;
  41. var
  42. strstream : TStringStream;
  43. zipstream : TStringStream;
  44. begin
  45. strstream := TStringStream.Create(aStr,TEncoding.UTF8);
  46. try
  47. zipstream := TStringStream.Create('',TEncoding.ANSI);
  48. try
  49. ZCompressStream(strstream, zipstream, aCompressionLevel);
  50. zipstream.Position := 0;
  51. Result := zipstream.DataString;
  52. finally
  53. zipstream.Free;
  54. end;
  55. finally
  56. strstream.Free;
  57. end;
  58. end;
  59. function DecompressString_Deprecated(const aStr: string) : string;
  60. var
  61. strstream : TStringStream;
  62. zipstream : TStringStream;
  63. begin
  64. zipstream := TStringStream.Create(aStr,TEncoding.ANSI);
  65. try
  66. strstream := TStringStream.Create('',TEncoding.UTF8);
  67. try
  68. zipstream.Position := 0;
  69. ZDecompressStream(zipstream,strstream);
  70. strstream.Position := 0;
  71. Result := strstream.DataString;
  72. finally
  73. strstream.Free;
  74. end;
  75. finally
  76. zipstream.Free;
  77. end;
  78. end;
  79. function CompressString(const aStr : string; aCompressionLevel : TCompressionLevel = zcDefault) : string;
  80. var
  81. instream : TStringStream;
  82. zipstream : TMemoryStream;
  83. outstream : TStringStream;
  84. begin
  85. instream := TStringStream.Create(aStr,TEncoding.UTF8);
  86. try
  87. zipstream := TMemoryStream.Create;
  88. try
  89. ZCompressStream(instream,zipstream,aCompressionLevel);
  90. zipstream.Position := 0;
  91. outstream := TStringStream.Create('',TEncoding.UTF8);
  92. try
  93. outstream.CopyFrom(zipstream,0);
  94. Result := string(outstream.DataString);
  95. finally
  96. outstream.Free;
  97. end;
  98. finally
  99. zipstream.Free;
  100. end;
  101. finally
  102. instream.Free;
  103. end;
  104. end;
  105. function DecompressString(const aStr: string) : string;
  106. var
  107. instream : TStringStream;
  108. zipstream : TMemoryStream;
  109. outstream : TStringStream;
  110. begin
  111. instream := TStringStream.Create(aStr,TEncoding.UTF8);
  112. try
  113. zipstream := TStringStream.Create;
  114. try
  115. zipstream.CopyFrom(instream,0);
  116. outstream := TStringStream.Create('',TEncoding.UTF8);
  117. try
  118. ZDecompressStream(zipstream,outstream);
  119. outstream.Position := 0;
  120. Result := string(outstream.DataString);
  121. finally
  122. outstream.Free;
  123. end;
  124. finally
  125. zipstream.Free;
  126. end;
  127. finally
  128. instream.Free;
  129. end;
  130. end;
  131. function CompressGZipString(const aStr : string; aCompressionLevel : TCompressionLevel = zcDefault) : string;
  132. var
  133. instream : TStringStream;
  134. outstream : TStringStream;
  135. zipstream : TZCompressionStream;
  136. begin
  137. outstream := TStringStream.Create('',TEncoding.ANSI);
  138. try
  139. zipstream := TZCompressionStream.Create(outstream,System.ZLib.TZCompressionLevel(aCompressionLevel),15 + 16);
  140. try
  141. instream := TStringStream.Create(aStr,TEncoding.UTF8);
  142. try
  143. instream.Position := 0;
  144. zipstream.CopyFrom(instream,instream.Size);
  145. finally
  146. instream.Free;
  147. end;
  148. finally
  149. zipstream.Free;
  150. end;
  151. outstream.Position := 0;
  152. Result := outstream.DataString;
  153. finally
  154. outstream.Free;
  155. end;
  156. end;
  157. function DecompressGZipString(const aStr: string) : string;
  158. var
  159. outstream : TStringStream;
  160. instream : TStringStream;
  161. unzipstream : TZDecompressionStream;
  162. begin
  163. outstream := TStringStream.Create('',TEncoding.UTF8);
  164. try
  165. instream := TStringStream.Create(aStr,TEncoding.ANSI);
  166. try
  167. unzipstream := nil;
  168. try
  169. unzipstream := TZDecompressionStream.Create(instream,15 + 16);
  170. outstream.CopyFrom(unzipstream,0);
  171. finally
  172. unzipstream.Free;
  173. end;
  174. finally
  175. instream.Free;
  176. end;
  177. outstream.Position := 0;
  178. Result := outstream.DataString;
  179. finally
  180. outstream.Free;
  181. end;
  182. end;
  183. function CompressAndEncodeString(const aStr: string; aCompressionLevel : TCompressionLevel = zcDefault): string;
  184. var
  185. utf8stream: TStringStream;
  186. zipstream: TMemoryStream;
  187. base64stream: TStringStream;
  188. begin
  189. utf8stream := TStringStream.Create(aStr,TEncoding.UTF8);
  190. try
  191. zipstream := TMemoryStream.Create;
  192. try
  193. ZCompressStream(utf8stream,zipstream,TZCompressionLevel(aCompressionLevel));
  194. base64stream := TStringStream.Create('',TEncoding.ASCII);
  195. try
  196. zipstream.Position := 0;
  197. TNetEncoding.Base64.Encode(zipstream,base64stream);
  198. base64stream.Position := 0;
  199. Result := string(base64stream.DataString);
  200. finally
  201. base64stream.Free;
  202. end;
  203. finally
  204. zipstream.Free;
  205. end;
  206. finally
  207. utf8stream.Free;
  208. end;
  209. end;
  210. function DecodeAndDecompressString(const aStr: string): string;
  211. var
  212. utf8stream: TStringStream;
  213. zipstream: TMemoryStream;
  214. base64stream: TStringStream;
  215. begin
  216. base64stream := TStringStream.Create(aStr,TEncoding.ASCII);
  217. try
  218. zipstream := TMemoryStream.Create;
  219. try
  220. base64stream.Position := 0;
  221. TNetEncoding.Base64.Decode(base64stream,zipstream);
  222. zipstream.Position := 0;
  223. utf8stream := TStringStream.Create('',TEncoding.UTF8);
  224. try
  225. ZDecompressStream(zipstream,utf8stream);
  226. Result := string(utf8stream.DataString);
  227. finally
  228. utf8stream.Free;
  229. end;
  230. finally
  231. zipstream.Free;
  232. end;
  233. finally
  234. base64stream.Free;
  235. end;
  236. end;
  237. end.