Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <assert.h>
- #include <string>
- using std::string;
- class CBitOStream {
- public:
- CBitOStream();
- void WriteBit( bool bit );
- void WriteByte( unsigned char byte );
- // Закрывает поток - перебрасывает буфер в результирующую строку, дописывает число бит в последнем байте.
- void Close();
- // Получить результат можно только после Close.
- string GetResult() const;
- private:
- string result;
- unsigned char buffer;
- char bitsInBuffer;
- bool isClosed;
- };
- CBitOStream::CBitOStream() :
- buffer( 0 ),
- bitsInBuffer( 0 ),
- isClosed( false )
- {
- }
- void CBitOStream::WriteBit( bool bit )
- {
- assert( !isClosed );
- // Устанавливаем или сбрасываем нужный бит. Первыми битами считаем старшие.
- if( bit ) {
- buffer |= 1 << ( 7 - bitsInBuffer );
- } else {
- buffer &= ~( 1 << ( 7 - bitsInBuffer ) );
- }
- ++bitsInBuffer;
- if( bitsInBuffer == 8 ) {
- // Буфер закончился. Сбрасываем в результирующую строку.
- result.push_back( buffer );
- buffer = 0;
- bitsInBuffer = 0;
- }
- }
- void CBitOStream::WriteByte( unsigned char byte )
- {
- assert( !isClosed );
- buffer |= byte >> ( bitsInBuffer ); // Пользуемся тем, что оставшиеся с buffer байты нулевые.
- unsigned char nextBuffer = byte << ( 8 - bitsInBuffer );
- // Сбрасываем буфер в результирующую строку.
- result.push_back( buffer );
- buffer = nextBuffer;
- }
- void CBitOStream::Close()
- {
- assert( !isClosed );
- if( bitsInBuffer == 0 ) {
- // Дописываем, что в последнем байте 8 значащих бит.
- result.push_back( 8 );
- } else {
- // Скидываем недозаполненный буфер и количество значащих бит.
- result.push_back( buffer );
- result.push_back( bitsInBuffer );
- }
- isClosed = true;
- }
- string CBitOStream::GetResult() const
- {
- assert( isClosed );
- return result;
- }
- // ----------------------------------------------------------------------------------------------------------
- class CBitIStream {
- public:
- explicit CBitIStream( const string& _source );
- // Чтение неоконченного потока.
- bool ReadBit();
- unsigned char ReadByte();
- bool IsFinished() const;
- private:
- const string source;
- int bitsCount; // Общее число бит.
- int pos; // Считанное число бит.
- };
- CBitIStream::CBitIStream( const string& _source ) :
- source( _source ),
- pos( 0 )
- {
- assert( !source.empty() );
- // Общее число бит.
- bitsCount = 8 * ( source.length() - 2 ) + source[source.length() - 1];
- }
Add Comment
Please, Sign In to add comment