13,826
社区成员
发帖
与我相关
我的任务
分享
void StreamUncompress(TMemoryStream *StmDesc, TMemoryStream *StmGzip)
{
// 建立管道
int fdpipe[2];
if( _pipe( fdpipe, StmGzip->Size, O_BINARY ) == -1 ) return;
// 写StmGzip到管道
_write( fdpipe[1], StmGzip->Memory, StmGzip->Size );
close(fdpipe[1]); // fdpipe[1]是用于写入的管道
// 用gzFile读管道
int r=0;
char buf[512];
gzFile gSrc = gzdopen(dup(fdpipe[0]),"rb"); //以读方式打开
while(( r = gzread(gSrc,buf,512) ) > 0 )
{
StmDesc->Write(buf,r); // 用gzread读出来的就是解压后的数据, 长度是r
}
gzclose(gSrc);
close(fdpipe[0]); // 这是用于读的管道
}
void __fastcall TForm1::btn1Click(TObject *Sender)
{
TMemoryStream *mstrSrc = new TMemoryStream;
mstrSrc->LoadFromFile("c:\\Plan.txt.gz"); // 我自己做试验用的,为了得到一个gzip的内存流,楼主应该是从别的地方得到的内存流吧?
TMemoryStream *mstrDesc = new TMemoryStream; // 目标内存流
StreamUncompress(mstrDesc,mstrSrc); // mstrSrc -->解压--> mstrDesc
delete mstrSrc;
mstrDesc->SaveToFile("c:\\desc.txt"); // 存出来看看对不对:)
delete mstrDesc;
}