谢谢楼上。其实我上面的代码没错,内存流方式貌似成功,但不是GZIP压缩,可以压缩解压。
但是,得到的不是GZIP数据格式。
后来还是通过“临时文件”方式搞定了。干脆把代码放在这里,也许有点参考价值:
// 获取返回的Gzip压缩数据
iEngine->RecvInfoL();
const TDesC8& respStr8 = iEngine->RecvData();
TBuf8<1200> respStr_1;
respStr_1.Copy(respStr8);
//收到的压缩数据写入一个临时文件,10个字节的头部信息后才是压缩流
RFs& fs = iCoeEnv->FsSession();
RFile iGzipFile;
_LIT(KGZIPFileName, "c:\\test_gzip.gz");
User::LeaveIfError(iGzipFile.Replace(fs, KGZIPFileName, EFileWrite|EFileStream|EFileShareAny));
TUint8* en_ptr = const_cast<TUint8*>(respStr_1.Ptr());
en_ptr = en_ptr + 10;
TPtr8 en_data(en_ptr, respStr_1.Length()-10, respStr_1.MaxLength()-10);
iGzipFile.Write(en_data, respStr_1.Length()-10);
iGzipFile.Close();
//解压出一个临时文件
RFile iUnGzipFile;
_LIT(KUNGZIPFileName, "c:\\test_ungzip.tmp");
User::LeaveIfError(iUnGzipFile.Replace(fs, KUNGZIPFileName, EFileWrite|EFileStream|EFileShareAny));
TInt aBufferSize=0x8000;
CleanupClosePushL(iUnGzipFile);
CEZGZipToFile *decompressor = CEZGZipToFile::NewLC(fs, KGZIPFileName, iUnGzipFile,aBufferSize);
while(decompressor->InflateL())
{
}
iUnGzipFile.Flush();
//读解压后的临时文件
TInt aFileSize;
iUnGzipFile.Size(aFileSize);
TBuf8<1200> ugBuf;
TInt aSeek = 0;
iUnGzipFile.Seek( ESeekStart, aSeek );
iUnGzipFile.Read(ugBuf ,aFileSize);
iUnGzipFile.Close();
CleanupStack::PopAndDestroy(2);
