Search code examples
c#bitarraybinaryreaderbinarystream

BinaryReader - Reading a Single " BIT "?


Case :
Again trying to capture packets through my NIC,
I have developed 2 Extensions to use in capturing variable number of bits

    public static string ReadBits ( this BinaryReader Key , int Value )
    {
        BitArray _BitArray = new BitArray ( Value );

        for ( int Loop = 0 ; Loop > Value ; Loop++ )
        {
/* Problem HERE ---> */   _BitArray [ Loop ] = Key . ReadBoolean ( );
        }

        return BitConverter . ToString ( _BitArray . ToByteArray ( ) );
    }

    public static byte [ ] ToByteArray ( this BitArray Key )
    {
        byte [ ] Value = new byte [ ( int ) Math . Ceiling ( ( double ) Key . Length / 8 ) ];
        Key . CopyTo ( Value , 0 );
        return Value;
    }

Problem :

_BitArray [ Loop ] = Key . ReadBoolean ( );  

As I'm trying to read single bits, but referring to MSDN Documentation,
It advances the stream position by 1 BYTE not 1 BIT !!!

Reads a Boolean value from the current stream and advances the current position of the stream by one byte.

Question :
Can I really capture "ONLY" 1 Bit & advance the stream position by 1 Bit ?
Please suggest me solutions or ideas :)

Regards,


Solution

  • No, Stream positioning is based on byte step. You can write your own stream implementation with bit positioning.

    class BitReader
    {
        int _bit;
        byte _currentByte;
        Stream _stream;
        public BitReader(Stream stream)
        { _stream = stream; }
    
        public bool? ReadBit(bool bigEndian = false)
        {
          if (_bit == 8 ) 
          {
    
            var r = _stream.ReadByte();
            if (r== -1) return null;
            _bit = 0; 
            _currentByte  = (byte)r;
          }
          bool value;
          if (!bigEndian)
             value = (_currentByte & (1 << _bit)) > 0;
          else
             value = (_currentByte & (1 << (7-_bit))) > 0;
    
          _bit++;
          return value;
        }
    }