BinaryReader - Reading a Single “ BIT ”?

筅森魡賤 提交于 2019-12-05 22:04:56
Pavel Krymets

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;
    }
}

No it's not possible to advance a Stream instance by one bit. The smallest granularity the Stream type supports is one byte.

You could write a wrapper around Stream which provides the one bit granularity by manipulating and caching the one byte movement.

class BitStream { 
  private Stream _stream;
  private byte _current;
  private int _index = 8;


  public byte ReadBit() {
    if (_index >= 8) {
      _current = _stream.ReadByte();
      _index = 0;
    }
    return (_current >> _index++) & 0x1;
  }
}

Note: This will read the byte from the right side into bits. If you wanted to read from the left you'd need to change the return line a bit

Read 1 byte and covert it to 8-element bool array using bit masks

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!