65.9K
CodeProject 正在变化。 阅读更多。
Home

BZip2 类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.66/5 (22投票s)

2003年2月11日

1分钟阅读

viewsIcon

116381

downloadIcon

1993

两个类,用于使用 bzip2 压缩/解压缩数据

Sample Image - BZ2Class.jpg

引言

在我的一个先前项目中,我需要包含一个数据备份选项。由于我不想使用一些外部工具(例如 pkzip),我决定自己包含一个压缩库。

我检查了 zliblibbzip2。最终,我不得不使用 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

您可以将源代码包含在任何产品中(商业、共享软件、免费软件或其他)。您可以以任何您想要的方式修改源代码。如果您在使用这些类时给予署名,我将不胜感激。

© . All rights reserved.