sys.zlib.pas

sys.zlib.pas

复制代码
unit sys.zlib;

// cxg 2025-1-10 fit(fpc+delphi)
interface

uses
{$IFDEF fpc}
  ZStream,
{$else}
  zlib,
{$endif}
Variants, SysUtils, Classes;

function CompressVariant(V: OleVariant): OleVariant;
function CompressStream(val: TStream): TStream;
function CompressBytes(val: TBytes): TBytes;

function DeCompressVariant(V: OleVariant): OleVariant;
function DeCompressStream(val: TStream): TStream;
function DeCompressBytes(val: TBytes): TBytes;

implementation

procedure StreamToVariant(Stream: TStream; var V: OleVariant);
var
  P: Pointer;
begin
  V := VarArrayCreate([0, Stream.Size - 1], varByte);
  P := VarArrayLock(V);
  try
    Stream.Position := 0;
    Stream.Read(P^, Stream.Size);
  finally
    VarArrayUnlock(V);
  end;
end;

procedure VariantToStream(const V: OleVariant; Stream: TStream);
var
  P: Pointer;
begin
  Stream.Position := 0;
  Stream.Size := VarArrayHighBound(V, 1) - VarArrayLowBound(V, 1) + 1;
  P := VarArrayLock(V);
  try
    Stream.Write(P^, Stream.Size);
  finally
    VarArrayUnlock(V);
  end;
  Stream.Position := 0;
end;

function CompressBytes(val: TBytes): TBytes;
var
  zipStream: TCompressionStream;
  Stream: TBytesStream;
begin
  Stream := TBytesStream.Create(val);
  try
    zipStream := TCompressionStream.Create(cldefault, Stream);
    try
      SetLength(Result, zipStream.Size);
      zipStream.Position := 0;
      zipStream.Read(PByte(Result)^, zipStream.Size);
    finally
      zipStream.Free;
    end;
  finally
    Stream.Free;
  end;
end;

function CompressStream(val: TStream): TStream;
begin
  Result := TCompressionStream.Create(cldefault, val);
end;

function CompressVariant(V: OleVariant): OleVariant;
var
  zipStream: TCompressionStream;
  Stream: TStream;
begin
  Stream := TMemoryStream.Create;
  try
    VariantToStream(V, Stream);
    zipStream := TCompressionStream.Create(cldefault, Stream);
    try
      StreamToVariant(zipStream, Result);
    finally
      zipStream.Free;
    end;
  finally
    Stream.Free;
  end;
end;

function DeCompressBytes(val: TBytes): TBytes;
var
  Stream: TBytesStream;
  zipStream: TDecompressionStream;
begin
  Stream := TBytesStream.Create(val);
  try
    zipStream := TDecompressionStream.Create(Stream);
    try
      SetLength(Result, zipStream.Size);
      zipStream.Position := 0;
      zipStream.Read(PByte(val)^, zipStream.Size);
    finally
      zipStream.Free;
    end;
  finally
    Stream.Free;
  end;
end;

function DeCompressStream(val: TStream): TStream;
begin
  Result := TDecompressionStream.Create(val);
end;

function DeCompressVariant(V: OleVariant): OleVariant;
var
  zipStream: TDecompressionStream;
  Stream: TStream;
begin
  Stream := TMemoryStream.Create;
  try
    VariantToStream(V, Stream);
    zipStream := TDecompressionStream.Create(Stream);
    try
      StreamToVariant(zipStream, Result);
    finally
      zipStream.Free;
    end;
  finally
    Stream.Free;
  end;
end;

end.
复制代码

 

posted @   delphi中间件  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2017-01-10 FIREDAC TFDCONNECTION连接ORACLE
2017-01-10 WEBXONE IIS部署C/S程序
2014-01-10 delphi 控制 EXCEL 数据透视表
2013-01-10 datasnap 长连接、短连接
点击右上角即可分享
微信分享提示