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

📄 modelorder0c.cpp

📁 转自德国Eric Bodden的数据压缩算术编码专著。有极强的学术价值。
💻 CPP
字号:
#include "ModelOrder0C.h"

ModelOrder0C::ModelOrder0C()
{
	// H鋟figkeiten mit 1 initialisieren
	mTotal = 257; // 256 + Endsymbol
	for( unsigned int i=0; i<257; i++ )
		mCumCount[i] = 1;	
}

void ModelOrder0C::Encode()
{
	while( !mSource->eof() )
	{
		unsigned char symbol;

		// Symbol lesen
		mSource->read( reinterpret_cast<char*>(&symbol), sizeof( symbol ) );

		if( !mSource->eof() )
		{
			// H鋟figkeiten kumulieren
			unsigned int low_count = 0;
			unsigned char j;
			for( j=0; j<symbol; j++ )
				low_count += mCumCount[j];

			// Symbol kodieren
			mAC.Encode( low_count, low_count + mCumCount[j], mTotal );

			// update model
			mCumCount[ symbol ]++;
			mTotal++;
		}
	}

	// End-Symbol schreiben
	mAC.Encode( mTotal-1, mTotal, mTotal );
}

void ModelOrder0C::Decode()
{
	unsigned int symbol;

	do
	{
		unsigned int value;

		// Wert lesen
		value = mAC.DecodeTarget( mTotal );

		unsigned int low_count = 0;

		// Symbol bestimmen
		for( symbol=0; low_count + mCumCount[symbol] <= value; symbol++ )
			low_count += mCumCount[symbol];

		// Symbol schreiben
		if( symbol < 256 )
			mTarget->write( reinterpret_cast<char*>(&symbol), sizeof( char ) );

		// Dekoder anpassen
		mAC.Decode( low_count, low_count + mCumCount[ symbol ] );

		// update model
		mCumCount[ symbol ]++;
		mTotal++;
	}
	while( symbol != 256 );
}

⌨️ 快捷键说明

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