使用TStream*的gzip文件格式的压缩和解压函数

在论坛里回答一个关于在内存中直接对gzip格式解压的帖子时试验出来的代码

帖子:http://topic.csdn.net/u/20071015/16/14b00c8e-767d-4608-966a-0b5d29780768.html 

前提:

安装了zlib库

包含文件:

#include <zlib.h>
#include <io.h>
#include <fcntl.h>
#include <sys/stat.h>

代码:

/*
函数   StreamCompress, 压缩StmSrc中的数据到StmGzip里
参数1: TStream *StmGzip   -- 目标流,输出gzip压缩后的数据
参数2: TStream *StmSrc   -- 源流,输入源数据的流
返回值: true-成功 ; false - 失败
*/

bool  StreamCompress(TStream  * StmGzip, TStream  * StmSrc)
{
    
char  buf[ 512 ];
    
int  r = 0 ;

    
//  建立管道
     int  fdpipe[ 2 ];       //  fdpipe[1]是用于写入的管道, fdpipe[0]是用于读的管道
     if ( _pipe( fdpipe, compressBound(StmSrc -> Size) + 512  , O_BINARY )  ==   - 1  )  return   false ;

    
//  用zlib压缩数据到管道
    gzFile gDesc  =  gzdopen(dup(fdpipe[ 1 ]), " wb " );  // 以写方式打开中...
     if (gDesc  ==  NULL)
    {
        close(fdpipe[
1 ]);
        close(fdpipe[
0 ]);
        
return   false ;
    }

    StmSrc
-> Seek( 0 , 0 );
    
while ( ( r  =  StmSrc -> Read(buf, sizeof (buf)))  > 0  )     //  读取原数据->压缩中...
    {
        gzwrite(gDesc,buf,r);
    }
    gzclose(gDesc);
    close(fdpipe[
1 ]);

    
//  从管道里读出压缩后的数据 -> StmGzip
     while ((r  =  _read( fdpipe[ 0 ], buf,  sizeof (buf)))  >   0 )
    {
        StmGzip
-> Write(buf,r);
    }
    close(fdpipe[
0 ]); 
    
return   true ;
}

/*
函数   StreamUncompress, 解压StmGzip中的数据到StmDesc里
参数1: TStream *StmDesc   -- 目标流,输出解压后的数据
参数2: TStream *StmGzip   -- 源流,输入gzip压缩数据的流
返回值: true-成功 ; false - 失败
*/
bool  StreamUncompress(TStream  * StmDesc, TStream  * StmGzip)
{
    
char  buf[ 512 ];
    
int  r = 0 ;
    
//  建立管道
     int  fdpipe[ 2 ];        // fdpipe[1]是用于写入的管道, fdpipe[0]是用于读的管道
     if ( _pipe( fdpipe, StmGzip -> Size, O_BINARY )  ==   - 1  )  return   false ;

    
//  写StmGzip到管道fdpipe[1]
    StmGzip -> Seek( 0 , 0 );
    
while ( ( r  =  StmGzip -> Read(buf, sizeof (buf)))  > 0  ) _write( fdpipe[ 1 ], buf, r);
    close(fdpipe[
1 ]);

    
//  用zlib读管道并解压到stmDesc中
    gzFile gSrc  =  gzdopen(dup(fdpipe[ 0 ]), " rb " );  // 以读方式打开中...
     if (gSrc  ==  NULL)
    {
        close(fdpipe[
0 ]);
        
return   false ;
    }

    
while (( r  =  gzread(gSrc,buf, sizeof (buf)) )  >   0  )
    {
        StmDesc
-> Write(buf,r);     //  解压中...
    }

    gzclose(gSrc);
    close(fdpipe[
0 ]);
    
return   true ;
}

例2: 解压C:/Plan.txt.gz到C:/desc.txt

    TFileStream *mstrSrc = new TFileStream("c://Plan.txt.gz",fmOpenRead);

    TFileStream *mstrDesc = new TFileStream("c://desc.txt",fmCreate);

    StreamUncompress(mstrDesc,mstrSrc);

    delete mstrSrc;
    delete mstrDesc;

如果把这里的TFileStream改成TMemoryStream就可以直接内存操作了, 改成TWinSocketStream就可以直接传输gzip压缩数据, TBlobStream,TStringStream...

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值