Advertisement
smatskevich

Huffman Bits buffers

Dec 16th, 2017
313
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.89 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement