⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bz2.cpp

📁 bzlib,一个性能非常强劲的压缩库
💻 CPP
字号:
// BZ2.cpp: implementation of the CBZ2 class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "BZ2.h"

CBZ2Base::CBZ2Base(char* pWriteBuffer,unsigned int nWriteBufferSize)
{
	ZeroMemory(&m_Stream,sizeof(m_Stream));
	m_pWriteBuffer=pWriteBuffer;
	m_nWriteBufferSize=nWriteBufferSize;
}

CBZ2Compress::CBZ2Compress(char* pWriteBuffer,unsigned int nWriteBufferSize,int nBlockSize,int nWorkFactor) : CBZ2Base(pWriteBuffer,nWriteBufferSize)
{
	BZ2_bzCompressInit(&m_Stream,nBlockSize,0,nWorkFactor);
}

CBZ2Compress::~CBZ2Compress()
{
	BZ2_bzCompressEnd(&m_Stream);
}

unsigned int CBZ2Compress::Compress()
{
	m_Stream.next_out=m_pWriteBuffer;
	m_Stream.avail_out=m_nWriteBufferSize;
	while (true)
	{
		if (m_Stream.avail_in==0)
		{
			if ((m_Stream.avail_in=OnCompressRead(m_Stream.next_in))==0)
			{	// No more data left to read
				int nError;
				while (true)
				{
					nError=BZ2_bzCompress(&m_Stream,BZ_FINISH);
					switch (nError)
					{
					case BZ_FINISH_OK:
					case BZ_STREAM_END:
						OnCompressWrite(m_pWriteBuffer,m_nWriteBufferSize-m_Stream.avail_out);
						break;
					default:
						return 0;
					}
					if (nError==BZ_STREAM_END)
						return m_Stream.total_out_lo32;
					m_Stream.next_out=m_pWriteBuffer;
					m_Stream.avail_out=m_nWriteBufferSize;
				}
			}
		}
		if (BZ2_bzCompress(&m_Stream,BZ_RUN)!=BZ_RUN_OK)
			return 0;
		if (m_Stream.avail_out==0)
		{	// Flush data
			OnCompressWrite(m_pWriteBuffer,m_nWriteBufferSize);
			m_Stream.next_out=m_pWriteBuffer;
			m_Stream.avail_out=m_nWriteBufferSize;
		}
	}
	return 0;	// Won't be executed
}

CBZ2Decompress::CBZ2Decompress(char* pWriteBuffer,unsigned int nWriteBufferSize,int nSmall) : CBZ2Base(pWriteBuffer,nWriteBufferSize)
{
	BZ2_bzDecompressInit(&m_Stream,0,nSmall);
}

CBZ2Decompress::~CBZ2Decompress()
{
	BZ2_bzDecompressEnd(&m_Stream);
}

unsigned int CBZ2Decompress::Decompress()
{
	m_Stream.next_out=m_pWriteBuffer;
	m_Stream.avail_out=m_nWriteBufferSize;
	while (true)
	{
		if (m_Stream.avail_in==0)
		{
			if ((m_Stream.avail_in=OnDecompressRead(m_Stream.next_in))==0)
			{	// No more data left to read
				int nError;
				while (true)
				{
					nError=BZ2_bzDecompress(&m_Stream);
					switch (nError)
					{
					case BZ_OK:
					case BZ_STREAM_END:
						OnDecompressWrite(m_pWriteBuffer,m_nWriteBufferSize-m_Stream.avail_out);
						break;
					default:
						return 0;
					}
					if (nError==BZ_STREAM_END)
						return m_Stream.total_out_lo32;
					m_Stream.next_out=m_pWriteBuffer;
					m_Stream.avail_out=m_nWriteBufferSize;
				}
			}
		}
		switch (BZ2_bzDecompress(&m_Stream))
		{
		case BZ_OK:
			OnDecompressWrite(m_pWriteBuffer,m_nWriteBufferSize);
			m_Stream.next_out=m_pWriteBuffer;
			m_Stream.avail_out=m_nWriteBufferSize;
			break;
		case BZ_STREAM_END:
			OnDecompressWrite(m_pWriteBuffer,m_nWriteBufferSize-m_Stream.avail_out);
			return m_Stream.total_out_lo32;
			break;
		default:
			return 0;
		}
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -