uses ZLibEx
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);
Stream.Write (P^, Stream.Size);
VarArrayUnlock (V);
Stream.Position := 0;
end;
procedure StreamToVariant(Stream: TStream; var V: OLEVariant);
var
P : Pointer;
begin
V := VarArrayCreate ([0, Stream.Size - 1], varByte);
P := VarArrayLock (V);
Stream.Position := 0;
Stream.Read (P^, Stream.Size);
VarArrayUnlock (V);
end;
function CompressData(V: OleVariant): OleVariant;
var
M, M0: TMemoryStream;
begin
M := TMemoryStream.Create;
M0 := TMemoryStream.Create;
try
if V = Null then exit;
VariantToStream(V,M); //转换到流
M.Position := 0;
ZCompressStream(M, M0); //压缩流
StreamToVariant(M0, V); //转换到变体返回值
finally
M.Free;
M0.Free
end;
Result := V;
end;
function DeCompressData(V: OleVariant): OleVariant;
var
M, M0: TMemoryStream;
begin
M := TMemoryStream.Create;
M0 := TMemoryStream.Create;
try
if V = Null then exit;
VariantToStream(V,M); //转换到流
M.Position := 0;
ZDeCompressStream(M, M0); //压缩流
StreamToVariant(M0, V); //转换到变体返回值
finally
M.Free;
M0.Free
end;
Result := V;
end;