Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <assert.h>
- #include <vector>
- #include "Huffman.h"
- using std::vector;
- class CInputBitStream {
- public:
- CInputBitStream( IInputStream& _stream );
- // Считывание одного бита.
- bool ReadBit( bool& value );
- // Считывание одного байта.
- bool ReadByte( byte& value );
- private:
- IInputStream& stream;
- unsigned char lastByte; // Последний байт, считанный из stream.
- char readBitsCount; // Количество считанных бит из lastByte.
- };
- CInputBitStream::CInputBitStream( IInputStream& _stream ) :
- stream( _stream ),
- lastByte( 0 ),
- readBitsCount( 8 )
- {
- }
- bool CInputBitStream::ReadBit( bool& value )
- {
- assert( readBitsCount <= 8 );
- if( readBitsCount == 8 ) {
- // Биты закончились. Берем следующий.
- if( !stream.Read( lastByte ) ) {
- // Нету.
- return false;
- }
- readBitsCount = 0;
- }
- // Считаем очередной бит.
- ++readBitsCount;
- value = ( ( lastByte >> ( 8 - readBitsCount ) ) & 1 ) != 0;
- return true;
- }
- bool CInputBitStream::ReadByte( byte& value )
- {
- // Можно 8 раз сделать ReadBit, но все равно их надо приготовить в байт.
- // Поэтому сразу делаем нужный байт.
- assert( readBitsCount <= 8 );
- assert( readBitsCount != 0 );
- if( readBitsCount == 8 ) {
- return stream.Read( value );
- }
- const byte upper = lastByte << readBitsCount;
- if( !stream.Read( lastByte ) ) {
- return false;
- }
- const byte lower = lastByte >> ( 8 - readBitsCount );
- value = upper | lower;
- return true;
- }
- class CInputStream : public IInputStream {
- public:
- explicit CInputStream( vector<byte>&& source );
- // Возвращает false, если поток закончился
- virtual bool Read( byte& value ) override;
- private:
- vector<byte> data;
- int readBytesCount;
- };
- CInputStream::CInputStream( vector<byte>&& source ) :
- data( std::move( source ) ),
- readBytesCount( 0 )
- {
- }
- bool CInputStream::Read( byte& value )
- {
- if( readBytesCount >= static_cast<int>( data.size() ) ) {
- return false;
- }
- value = data[readBytesCount++];
- return true;
- }
- int main()
- {
- vector<byte> source = { 3, 8, 255, 0, 1 };
- CInputStream inputStream( std::move( source ) );
- CInputBitStream inputBitStream( inputStream );
- bool boolValue = false;
- inputBitStream.ReadBit( boolValue ); // 0
- inputBitStream.ReadBit( boolValue ); // 0
- inputBitStream.ReadBit( boolValue ); // 0
- inputBitStream.ReadBit( boolValue ); // 0
- inputBitStream.ReadBit( boolValue ); // 0
- inputBitStream.ReadBit( boolValue ); // 0
- inputBitStream.ReadBit( boolValue ); // 1
- inputBitStream.ReadBit( boolValue ); // 1
- inputBitStream.ReadBit( boolValue ); // 0
- byte value = 0;
- inputBitStream.ReadByte( value ); // 17
- return 0;
- }
Add Comment
Please, Sign In to add comment