smatskevich

Huffman Bits buffers

Dec 16th, 2017
147
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <assert.h>
  2. #include <iostream>
  3. #include "Haffman.h"
  4.  
  5. const int ByteSize = sizeof( byte ) * 8;
  6.  
  7. class CBitOutputStream final {
  8. public:
  9.     explicit CBitOutputStream( IOutputStream& _output );
  10.     ~CBitOutputStream() { Close(); }
  11.  
  12.     void WriteBit( bool bit );
  13.     void WriteByte( byte value );
  14.     // Записывает последние биты из буфера в отдельный байт.
  15.     // А также пишет спец.байт с количеством записанных бит в последний байт.
  16.     void Close();
  17.  
  18. private:
  19.     IOutputStream& output;
  20.     byte buffer;
  21.     int bufferBitsCount; // Количество бит в буфере. От 0 до 7.
  22. };
  23.  
  24. CBitOutputStream::CBitOutputStream( IOutputStream& _output ) :
  25.     output( _output ),
  26.     buffer( 0 ),
  27.     bufferBitsCount( 0 )
  28. {
  29. }
  30.  
  31. void CBitOutputStream::WriteBit( bool bit )
  32. {
  33.     assert( bufferBitsCount < ByteSize ); // Еще есть место в буфере.
  34.  
  35.     if( bit ) {
  36.         buffer |= 1 << bufferBitsCount; // Накладываем по маске.
  37.     } // else останется 0.
  38.  
  39.     ++bufferBitsCount;
  40.  
  41.     if( bufferBitsCount == ByteSize ) {
  42.         output.Write( buffer );
  43.         buffer = 0;
  44.         bufferBitsCount = 0;
  45.     }
  46. }
  47.  
  48. void CBitOutputStream::WriteByte( byte value )
  49. {
  50.     assert( bufferBitsCount < ByteSize ); // Еще есть место в буфере.
  51.  
  52.     if( bufferBitsCount == 0 ) {
  53.         // Буфер пуст. Пишем сразу в выходной поток.
  54.         output.Write( value );
  55.     } else {
  56.         // Младшие биты value сдвигаем и кладем в buffer.
  57.         buffer |= value << bufferBitsCount;
  58.         output.Write( buffer );
  59.         // Старшие биты сохраняем в начало buffer.
  60.         buffer = value >> ( ByteSize - bufferBitsCount );
  61.         // Обнуляем старшие разряды buffer.
  62.         buffer &= ( ( 1 << bufferBitsCount ) - 1 );
  63.     }
  64. }
  65.  
  66. void CBitOutputStream::Close()
  67. {
  68.     output.Write( buffer );
  69.     output.Write( bufferBitsCount );
  70. }
  71.  
  72. class COutputStream : public IOutputStream {
  73. public:
  74.     virtual void Write( byte value );
  75. };
  76.  
  77. void COutputStream::Write( byte value )
  78. {
  79.     for( int i = 0; i < ByteSize; ++i ) {
  80.         std::cout << ( ( value & ( 1 << i ) ) == 0 ? "0" : "1" );
  81.     }
  82.     std::cout << " ";
  83. }
  84.  
  85. int main()
  86. {
  87.     COutputStream myCout;
  88.     CBitOutputStream bitStream( myCout );
  89.     bitStream.WriteBit( true );
  90.     bitStream.WriteBit( true );
  91.     bitStream.WriteBit( false );
  92.     bitStream.WriteBit( false );
  93.     bitStream.WriteBit( true );
  94.     bitStream.WriteBit( false );
  95.     bitStream.WriteBit( true );
  96.     bitStream.WriteBit( false );
  97.     bitStream.WriteBit( true );
  98.     bitStream.WriteBit( false );
  99.     bitStream.WriteBit( true );
  100.     bitStream.WriteBit( false );
  101.     bitStream.WriteBit( false );
  102.     bitStream.WriteBit( false );
  103.     bitStream.WriteBit( true );
  104.     bitStream.WriteByte( 'a' );
  105.     bitStream.WriteBit( true );
  106.     bitStream.WriteBit( true );
  107.     bitStream.WriteBit( true );
  108.     return 0;
  109. }
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×