當(dāng)前位置:
首頁 >
Delphi使用Zlib
發(fā)布時(shí)間:2024/1/17
36
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Delphi使用Zlib
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
uses?
??zlib;?
//將Src使用Zlib壓縮后存入Dst當(dāng)中?
procedure?PackStream(const?Src:TStream;?Dst:TStream);?
var?
??CompStream:?TCompressionStream;?
begin?
??//增加“斷言”以防止輸入?yún)?shù)有誤?
??Assert(Src?<>?Nil);?
??Assert(Dst?<>?Nil);?
??CompStream?:=?TCompressionStream.Create(clDefault,Dst);?
??try?
????//將源數(shù)據(jù)的偏移轉(zhuǎn)到首部?
????Src.Seek(0,soFromBeginning);?
????//使用CopyFrom將源數(shù)據(jù)輸入到壓縮流,以實(shí)現(xiàn)壓縮?
????CompStream.CopyFrom(Src,0);?
??finally?
????CompStream.Free;?
??end;?
end;?
//將以zlib壓縮的Src解壓縮后存入Dst當(dāng)中?
procedure?UnpackStream(const?Src:TStream;?Dst:TStream);?
var?
??DecompStream:?TDecompressionStream;?
??NewSize:?Int64;?
begin?
??//增加“斷言”以防止輸入?yún)?shù)有誤?
??Assert(Src?<>?Nil);?
??Assert(Dst?<>?Nil);?
??DecompStream:=?TDecompressionStream.Create(Src);?
??try?
????//將源數(shù)據(jù)的偏移轉(zhuǎn)到首部?
????NewSize?:=?Src.Seek(0,?soFromEnd);?
????Src.Seek(0,?soFromBeginning);?
????//使用CopyFrom將源數(shù)據(jù)輸入到解壓縮流,以實(shí)現(xiàn)解壓縮?
????//并得到實(shí)際解壓縮后的數(shù)據(jù)大小(NewSize)?
????//內(nèi)部會使用AllocMem(System單元定義)對Dst進(jìn)行內(nèi)存重新分配?
????//所以,Dst的內(nèi)存管理必須兼容AllocMem進(jìn)行內(nèi)存分配?
????NewSize?:=?Dst.CopyFrom(DecompStream,NewSize);?
????//重新設(shè)置Dst的實(shí)際大小(已經(jīng)在解壓縮過程當(dāng)中進(jìn)行重新分配)?
????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當(dāng)中?
procedure?PackStream(const?Src:TStream;?Dst:TStream);?
var?
??CompStream:?TCompressionStream;?
begin?
??//增加“斷言”以防止輸入?yún)?shù)有誤?
??Assert(Src?<>?Nil);?
??Assert(Dst?<>?Nil);?
??CompStream?:=?TCompressionStream.Create(clDefault,Dst);?
??try?
????//將源數(shù)據(jù)的偏移轉(zhuǎn)到首部?
????Src.Seek(0,soFromBeginning);?
????//使用CopyFrom將源數(shù)據(jù)輸入到壓縮流,以實(shí)現(xiàn)壓縮?
????CompStream.CopyFrom(Src,0);?
??finally?
????CompStream.Free;?
??end;?
end;?
//將以zlib壓縮的Src解壓縮后存入Dst當(dāng)中?
procedure?UnpackStream(const?Src:TStream;?Dst:TStream);?
var?
??DecompStream:?TDecompressionStream;?
??NewSize:?Int64;?
begin?
??//增加“斷言”以防止輸入?yún)?shù)有誤?
??Assert(Src?<>?Nil);?
??Assert(Dst?<>?Nil);?
??DecompStream:=?TDecompressionStream.Create(Src);?
??try?
????//將源數(shù)據(jù)的偏移轉(zhuǎn)到首部?
????NewSize?:=?Src.Seek(0,?soFromEnd);?
????Src.Seek(0,?soFromBeginning);?
????//使用CopyFrom將源數(shù)據(jù)輸入到解壓縮流,以實(shí)現(xiàn)解壓縮?
????//并得到實(shí)際解壓縮后的數(shù)據(jù)大小(NewSize)?
????//內(nèi)部會使用AllocMem(System單元定義)對Dst進(jìn)行內(nèi)存重新分配?
????//所以,Dst的內(nèi)存管理必須兼容AllocMem進(jìn)行內(nèi)存分配?
????NewSize?:=?Dst.CopyFrom(DecompStream,NewSize);?
????//重新設(shè)置Dst的實(shí)際大小(已經(jīng)在解壓縮過程當(dāng)中進(jìn)行重新分配)?
????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;
總結(jié)
以上是生活随笔為你收集整理的Delphi使用Zlib的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: order by居然不能直接在union
- 下一篇: G_OBJECT