Symbian中的数据压缩(GZIP)

来源:互联网 发布:网络信号屏蔽设置 编辑:程序博客网 时间:2024/06/05 08:30

转自:http://hi.baidu.com/letsherwel/blog/item/5ebf71ded4d4c953cdbf1a7c.html

用到的类:CEZCompressor、CEZDecompressor、MEZBufferManager、CEZZStream和CBufFlat。

//压缩
CBufFlat* Compress(const TDesC8& aData)
{
CBufFlat* nOutBuf = CBufFlat::NewL(128);
CBufferManager* nBufferManager = CBufferManager::NewLC(aData,*nOutBuf, 128);
CEZCompressor* compressor = CEZCompressor::NewLC(*nBufferManager, CEZCompressor::EBestCompression);

while (compressor->DeflateL())
{// loop here until the file is compressed
}
CleanupStack::PopAndDestroy(2); //compressor,nBufferManager
nOutBuf->Compress();

return nOutBuf;
}   //解压缩
CBufFlat* DeCompress(const TDesC8& aData)
{
CBufFlat* nOutBuf = CBufFlat::NewL(128);
CBufferManager *nBufferManager = CBufferManager::NewLC(aData,*nOutBuf,128);
CEZDecompressor *decompressor = CEZDecompressor::NewLC(*nBufferManager);
while (decompressor->InflateL())
{// loop here until the file is decompressed
}
CleanupStack::PopAndDestroy(2); //decompressor,bufManager

return nOutBuf;
}

其中“CBufferManager”继承自“MEZBufferManager”,该类的源代码如下:


#ifndef __BUFFERMANAGER_H__
#define __BUFFERMANAGER_H__

#include <EZCompressor.h>
#include <EZDecompressor.h>
#include <EZlib.h>

class CBufferManager : public CBase, public MEZBufferManager
{
public:
static CBufferManager* NewLC(const TDesC8& aInput, CBufFlat& aOutput, TInt aBufferSize = 64);
static CBufferManager* NewL(const TDesC8& aInput, CBufFlat& aOutput, TInt aBufferSize = 64);
~CBufferManager();

private:
CBufferManager(CBufFlat& aOutput);
void ConstructL(const TDesC8& aInput, TInt aBufferSize);

public: //from MEZBufferManager
void InitializeL(CEZZStream &aZStream);
void NeedInputL(CEZZStream &aZStream);
void NeedOutputL(CEZZStream &aZStream);
void FinalizeL(CEZZStream &aZStream);

private:
HBufC8* iInput;
CBufFlat& iOutput;

TInt iBufferSize;

TUint8* iInputBuffer;
TUint8* iOutputBuffer;

TPtr8 iInputDescriptor; // always points to start of the input Buffer
TPtr8 iOutputDescriptor; // always points to start of the output Buffer
};

#endif //__BUFFERMANAGER_H__

 

#include "BufferManager.h"

CEZZStream::CEZZStream()
:iOutputPointer(NULL), iOutputBufferLength(0)
{

}

CBufferManager* CBufferManager::NewL(const TDesC8& aInput, CBufFlat& aOutput, TInt aBufferSize)
{
CBufferManager* self = CBufferManager::NewLC(aInput, aOutput, aBufferSize);
CleanupStack::Pop();
return self;
}

CBufferManager* CBufferManager::NewLC(const TDesC8& aInput, CBufFlat& aOutput, TInt aBufferSize)
{
CBufferManager* self = new (ELeave) CBufferManager(aOutput);
CleanupStack::PushL(self);
self->ConstructL(aInput, aBufferSize);
return self;
}

void CBufferManager::ConstructL(const TDesC8& aInput, TInt aBufferSize)
{
if(aBufferSize <= 0)
{
   User::Leave(KErrArgument);
}

iBufferSize = aBufferSize;

iInputBuffer = new (ELeave) TUint8[iBufferSize];
iOutputBuffer = new (ELeave) TUint8[iBufferSize];

iInputDescriptor.Set(iInputBuffer, 0, iBufferSize);
iOutputDescriptor.Set(iOutputBuffer, 0, iBufferSize);

iInput = HBufC8::NewL(aInput.Length());
*iInput = aInput;
}

CBufferManager::~CBufferManager()
{
delete [] iInputBuffer;
delete [] iOutputBuffer;

delete iInput;
}

CBufferManager::CBufferManager(CBufFlat& aOutput)
:iOutput(aOutput), iInput(NULL), iInputDescriptor(NULL,0), iOutputDescriptor(NULL,0)
{
}


void CBufferManager::InitializeL(CEZZStream& aZStream)
{
NeedInputL(aZStream);
aZStream.SetOutput(iOutputDescriptor);
}

void CBufferManager::NeedInputL(CEZZStream& aZStream)
{
TInt length = (iBufferSize > iInput->Length()) ? iInput->Length() : iBufferSize;
iInputDescriptor.Copy((TUint8*)iInput->Des().Ptr(), length);
iInput->Des().Delete(0, length);

aZStream.SetInput(iInputDescriptor);
}

void CBufferManager::NeedOutputL(CEZZStream& aZStream)
{
TPtrC8 od = aZStream.OutputDescriptor();
iOutput.InsertL(iOutput.Size(), od);
aZStream.SetOutput(iOutputDescriptor);
}

void CBufferManager::FinalizeL(CEZZStream& aZStream)
{
TPtrC8 od = aZStream.OutputDescriptor();
iOutput.InsertL(iOutput.Size(), od);
}

原创粉丝点击