📄 bz2.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 + -