2010-10-06 修正解压缩代码 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; var N: Longint; Buffer: array[0..4095] of Byte; begin //增加“断言”以防止输入参数有误 Assert(Src <> Nil); Assert(Dst <> Nil); DecompStream := TDecompressionStream.Create(Src); try //NewSize := Src.Size; //将源数据的偏移转到首部 NewSize := 0; Dst.Seek(0, soFromBeginning); DecompStream.Seek(0,soFromBeginning); repeat N := DecompStream.Read(Buffer[0],4096); Dst.WriteBuffer(Buffer,N); NewSize := NewSize + N; until N <> 4096; 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; 2010-11-06 增加C++版(C++Builder2010)代码 #include "zlib.hpp"; //将Src使用Zlib压缩后存入Dst当中 void __fastcall PackStream( TStream *Src, TStream *Dst) { TCompressionStream* CompStream; __int64 SeekRet; //增加“断言”以防止输入参数有误 assert(Src); assert(Dst); CompStream = new TCompressionStream(Zlib::clDefault,Dst); try{ //将源数据的偏移转到首部 Src->Seek((__int64)0,soBeginning); //使用CopyFrom将源数据输入到压缩流,以实现压缩 CompStream->CopyFrom(Src,0); }__finally{ CompStream->Free(); } } //将以zlib压缩的Src解压缩后存入Dst当中 void __fastcall UnpackStream(TStream *Src, TStream *Dst) { TDecompressionStream *DecompStream; __int64 NewSize; long N; unsigned char Buffer[4096]; //增加“断言”以防止输入参数有误 assert(Src); assert(Dst); DecompStream = new TDecompressionStream(Src); try{ //NewSize := Src.Size; //将源数据的偏移转到首部 NewSize = 0; Dst->Seek((__int64)0, soBeginning); DecompStream->Seek((__int64)0,soBeginning); do{ N = DecompStream->Read( Buffer,4096); Dst->WriteBuffer( Buffer,N); NewSize = NewSize + N; }while (N == 4096); }__finally{ DecompStream->Free(); } } //测试代码 void __fastcall Test(void) { TMemoryStream *SrcStream,*PackedStream,*UnpackedStream; SrcStream = new TMemoryStream(); try{ SrcStream->LoadFromFile("c://test.xml"); PackedStream = new TMemoryStream(); try{ //压缩 PackStream(SrcStream, PackedStream); PackedStream->Seek((__int64)0, soBeginning); PackedStream->SaveToFile("c://test_xml.pk"); UnpackedStream =new TMemoryStream(); try{ //解压缩 UnpackStream(PackedStream, UnpackedStream); UnpackedStream->Seek((__int64)0, soBeginning); UnpackedStream->SaveToFile("c://test_xml.xml"); }__finally{ UnpackedStream->Free(); } }__finally{ PackedStream->Free(); } }__finally{ SrcStream->Free(); } }