Delphi使用Zlib
生活随笔
收集整理的這篇文章主要介紹了
Delphi使用Zlib
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
uses?
??zlib;?
//將Src使用Zlib壓縮后存入Dst當中?
procedure?PackStream(const?Src:TStream;?Dst:TStream);?
var?
??CompStream:?TCompressionStream;?
begin?
??//增加“斷言”以防止輸入參數有誤?
??Assert(Src?<>?Nil);?
??Assert(Dst?<>?Nil);?
??CompStream?:=?TCompressionStream.Create(clDefault,Dst);?
??try?
????//將源數據的偏移轉到首部?
????Src.Seek(0,soFromBeginning);?
????//使用CopyFrom將源數據輸入到壓縮流,以實現壓縮?
????CompStream.CopyFrom(Src,0);?
??finally?
????CompStream.Free;?
??end;?
end;?
//將以zlib壓縮的Src解壓縮后存入Dst當中?
procedure?UnpackStream(const?Src:TStream;?Dst:TStream);?
var?
??DecompStream:?TDecompressionStream;?
??NewSize:?Int64;?
begin?
??//增加“斷言”以防止輸入參數有誤?
??Assert(Src?<>?Nil);?
??Assert(Dst?<>?Nil);?
??DecompStream:=?TDecompressionStream.Create(Src);?
??try?
????//將源數據的偏移轉到首部?
????NewSize?:=?Src.Seek(0,?soFromEnd);?
????Src.Seek(0,?soFromBeginning);?
????//使用CopyFrom將源數據輸入到解壓縮流,以實現解壓縮?
????//并得到實際解壓縮后的數據大小(NewSize)?
????//內部會使用AllocMem(System單元定義)對Dst進行內存重新分配?
????//所以,Dst的內存管理必須兼容AllocMem進行內存分配?
????NewSize?:=?Dst.CopyFrom(DecompStream,NewSize);?
????//重新設置Dst的實際大小(已經在解壓縮過程當中進行重新分配)?
????Dst.Size?:=?NewSize;?
??finally?
????DecompStream.Free;?
??end;?
end;?
//測試代碼?
procedure?Test;?
var?
??SrcStream,PackedStream,UnpackedStream:TMemoryStream;?
begin?
??SrcStream?:=?TMemoryStream.Create;?
??try?
????SrcStream.LoadFromFile('c:\test.xml');?
????PackedStream?:=?TMemoryStream.Create;?
????try?
??????//壓縮?
??????PackStream(SrcStream,?PackedStream);?
??????PackedStream.Seek(0,?soFromBeginning);?
??????PackedStream.SaveToFile('c:\test_xml.pk');?
??????UnpackedStream?:=?TMemoryStream.Create;?
??????try?
????????//解壓縮?
????????UnpackStream(PackedStream,?UnpackedStream);?
????????UnpackedStream.Seek(0,?soFromBeginning);?
????????UnpackedStream.SaveToFile('c:\test_xml.xml');?
??????finally?
????????UnpackedStream.Free;?
??????end;?
????finally?
??????PackedStream.Free;?
????end;?
??finally?
????SrcStream.Free;?
??end;?
end;
??zlib;?
//將Src使用Zlib壓縮后存入Dst當中?
procedure?PackStream(const?Src:TStream;?Dst:TStream);?
var?
??CompStream:?TCompressionStream;?
begin?
??//增加“斷言”以防止輸入參數有誤?
??Assert(Src?<>?Nil);?
??Assert(Dst?<>?Nil);?
??CompStream?:=?TCompressionStream.Create(clDefault,Dst);?
??try?
????//將源數據的偏移轉到首部?
????Src.Seek(0,soFromBeginning);?
????//使用CopyFrom將源數據輸入到壓縮流,以實現壓縮?
????CompStream.CopyFrom(Src,0);?
??finally?
????CompStream.Free;?
??end;?
end;?
//將以zlib壓縮的Src解壓縮后存入Dst當中?
procedure?UnpackStream(const?Src:TStream;?Dst:TStream);?
var?
??DecompStream:?TDecompressionStream;?
??NewSize:?Int64;?
begin?
??//增加“斷言”以防止輸入參數有誤?
??Assert(Src?<>?Nil);?
??Assert(Dst?<>?Nil);?
??DecompStream:=?TDecompressionStream.Create(Src);?
??try?
????//將源數據的偏移轉到首部?
????NewSize?:=?Src.Seek(0,?soFromEnd);?
????Src.Seek(0,?soFromBeginning);?
????//使用CopyFrom將源數據輸入到解壓縮流,以實現解壓縮?
????//并得到實際解壓縮后的數據大小(NewSize)?
????//內部會使用AllocMem(System單元定義)對Dst進行內存重新分配?
????//所以,Dst的內存管理必須兼容AllocMem進行內存分配?
????NewSize?:=?Dst.CopyFrom(DecompStream,NewSize);?
????//重新設置Dst的實際大小(已經在解壓縮過程當中進行重新分配)?
????Dst.Size?:=?NewSize;?
??finally?
????DecompStream.Free;?
??end;?
end;?
//測試代碼?
procedure?Test;?
var?
??SrcStream,PackedStream,UnpackedStream:TMemoryStream;?
begin?
??SrcStream?:=?TMemoryStream.Create;?
??try?
????SrcStream.LoadFromFile('c:\test.xml');?
????PackedStream?:=?TMemoryStream.Create;?
????try?
??????//壓縮?
??????PackStream(SrcStream,?PackedStream);?
??????PackedStream.Seek(0,?soFromBeginning);?
??????PackedStream.SaveToFile('c:\test_xml.pk');?
??????UnpackedStream?:=?TMemoryStream.Create;?
??????try?
????????//解壓縮?
????????UnpackStream(PackedStream,?UnpackedStream);?
????????UnpackedStream.Seek(0,?soFromBeginning);?
????????UnpackedStream.SaveToFile('c:\test_xml.xml');?
??????finally?
????????UnpackedStream.Free;?
??????end;?
????finally?
??????PackedStream.Free;?
????end;?
??finally?
????SrcStream.Free;?
??end;?
end;
總結
以上是生活随笔為你收集整理的Delphi使用Zlib的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: order by居然不能直接在union
- 下一篇: G_OBJECT