BZip2 类






4.66/5 (22投票s)
2003年2月11日
1分钟阅读

116381

1993
两个类,用于使用 bzip2 压缩/解压缩数据
引言
在我的一个先前项目中,我需要包含一个数据备份选项。由于我不想使用一些外部工具(例如 pkzip),我决定自己包含一个压缩库。
我检查了 zlib 和 libbzip2。最终,我不得不使用 bzip2,因为我需要小型的备份文件,并且该库提供更好的压缩结果。
为了简化操作,我创建了 2 个类来处理压缩/解压缩的使用。
使用代码
class CBZ2Base { protected: CBZ2Base(char* pWriteBuffer,unsigned int nWriteBufferSize); protected: bz_stream m_Stream; char* m_pWriteBuffer; unsigned int m_nWriteBufferSize; };基础类是
CBZ2Base
。主要类(CBZ2Compress,CBZ2Decompress
)是从基础类派生的。它包含一个私有变量(m_Stream
)来处理 bzip2 库。class CBZ2Compress : CBZ2Base { public: CBZ2Compress(char* pWriteBuffer,unsigned int nWriteBufferSize,您需要为输出数据分配一个缓冲区,并将其传递给构造函数。每个类包含两个虚拟函数,用于读取和写入数据。您需要重写它们,并使用您自己的代码来填充缓冲区(读取时)和处理缓冲区(写入时)。
int nBlockSize=9,int nWorkFactor=30); virtual ~CBZ2Compress(); public: unsigned int Compress(); protected: virtual unsigned int OnCompressRead(char* &pBuffer)=0; virtual void OnCompressWrite(const char* pBuffer,unsigned int nLength)=0; }; class CBZ2Decompress : CBZ2Base { public: CBZ2Decompress(char* pWriteBuffer,unsigned int nWriteBufferSize,
int nSmall=false); virtual ~CBZ2Decompress(); public: unsigned int Decompress(); protected: virtual unsigned int OnDecompressRead(char* &pBuffer)=0; virtual void OnDecompressWrite(const char* pBuffer,
unsigned int nLength)=0; };
一个简单的代码示例,用于处理文件压缩
class CMyCompression : public CBZ2Compress { public: CMyCompression() : CBZ2Compress(m_szWriteBuffer,sizeof(m_szWriteBuffer)) { // Initialize with our buffer } BOOL Start(LPCTSTR szSource,LPCTSTR szTarget) { BOOL bResult=FALSE; // Assume failure if (m_fileSource.Open(szSource,CFile::modeRead)) { if (m_fileTarget.Open(szTarget,类似的代码将用于解压缩
CFile::modeCreate|CFile::modeWrite)) { bResult=(Compress()>0);
// Function should return packed buffer length
m_fileTarget.Close(); } m_fileSource.Close(); } return bResult; } protected: virtual unsigned int OnCompressRead(char *&pBuffer) { // Read some data from our source file return m_fileSource.Read(pBuffer=m_szReadBuffer,
sizeof(m_szReadBuffer)); } void OnCompressWrite(const char *pBuffer, unsigned int nLength) { // Write some data to our target file m_fileTarget.Write(pBuffer,nLength); } private: CFile m_fileSource,m_fileTarget; char m_szReadBuffer[4096],m_szWriteBuffer[4096]; }; void main() { CMyCompression a; a.Start(_T("test.tmp"),_T("test.bz2")); }
包含的文件包含一个静态库,其中包含两个类。还有一个简单的演示程序,用于压缩/解压缩文件。您可以查看演示源代码以了解更多关于使用这些类的信息。
Copyright
您可以将源代码包含在任何产品中(商业、共享软件、免费软件或其他)。您可以以任何您想要的方式修改源代码。如果您在使用这些类时给予署名,我将不胜感激。