Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <assert.h>
- #include <iostream>
- #include "Haffman.h"
- const int ByteSize = sizeof( byte ) * 8;
- class CBitOutputStream final {
- public:
- explicit CBitOutputStream( IOutputStream& _output );
- ~CBitOutputStream() { Close(); }
- void WriteBit( bool bit );
- void WriteByte( byte value );
- // Записывает последние биты из буфера в отдельный байт.
- // А также пишет спец.байт с количеством записанных бит в последний байт.
- void Close();
- private:
- IOutputStream& output;
- byte buffer;
- int bufferBitsCount; // Количество бит в буфере. От 0 до 7.
- };
- CBitOutputStream::CBitOutputStream( IOutputStream& _output ) :
- output( _output ),
- buffer( 0 ),
- bufferBitsCount( 0 )
- {
- }
- void CBitOutputStream::WriteBit( bool bit )
- {
- assert( bufferBitsCount < ByteSize ); // Еще есть место в буфере.
- if( bit ) {
- buffer |= 1 << bufferBitsCount; // Накладываем по маске.
- } // else останется 0.
- ++bufferBitsCount;
- if( bufferBitsCount == ByteSize ) {
- output.Write( buffer );
- buffer = 0;
- bufferBitsCount = 0;
- }
- }
- void CBitOutputStream::WriteByte( byte value )
- {
- assert( bufferBitsCount < ByteSize ); // Еще есть место в буфере.
- if( bufferBitsCount == 0 ) {
- // Буфер пуст. Пишем сразу в выходной поток.
- output.Write( value );
- } else {
- // Младшие биты value сдвигаем и кладем в buffer.
- buffer |= value << bufferBitsCount;
- output.Write( buffer );
- // Старшие биты сохраняем в начало buffer.
- buffer = value >> ( ByteSize - bufferBitsCount );
- // Обнуляем старшие разряды buffer.
- buffer &= ( ( 1 << bufferBitsCount ) - 1 );
- }
- }
- void CBitOutputStream::Close()
- {
- output.Write( buffer );
- output.Write( bufferBitsCount );
- }
- class COutputStream : public IOutputStream {
- public:
- virtual void Write( byte value );
- };
- void COutputStream::Write( byte value )
- {
- for( int i = 0; i < ByteSize; ++i ) {
- std::cout << ( ( value & ( 1 << i ) ) == 0 ? "0" : "1" );
- }
- std::cout << " ";
- }
- int main()
- {
- COutputStream myCout;
- CBitOutputStream bitStream( myCout );
- bitStream.WriteBit( true );
- bitStream.WriteBit( true );
- bitStream.WriteBit( false );
- bitStream.WriteBit( false );
- bitStream.WriteBit( true );
- bitStream.WriteBit( false );
- bitStream.WriteBit( true );
- bitStream.WriteBit( false );
- bitStream.WriteBit( true );
- bitStream.WriteBit( false );
- bitStream.WriteBit( true );
- bitStream.WriteBit( false );
- bitStream.WriteBit( false );
- bitStream.WriteBit( false );
- bitStream.WriteBit( true );
- bitStream.WriteByte( 'a' );
- bitStream.WriteBit( true );
- bitStream.WriteBit( true );
- bitStream.WriteBit( true );
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement