BinaryReader - чтение одного "BIT"? - PullRequest
3 голосов
/ 26 февраля 2012

Дело:
Снова пытаюсь перехватить пакеты через мой NIC,
Я разработал 2 расширения для использования с переменным числом битов

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

Проблема:

_BitArray [ Loop ] = Key . ReadBoolean ( );  

Поскольку я пытаюсь прочитать отдельные биты, но обращаюсь к Документация MSDN ,
Это продвигает позицию потока на 1 БАЙТ, а не на 1 БИТ !!!

Считывает логическое значение из текущего потока и увеличивает текущее значение. положение потока на один байт .

Вопрос:
Могу ли я действительно захватить «ТОЛЬКО» 1 бит и увеличить позицию потока на 1 бит?
Пожалуйста, предложите мне решения или идеи :)

С уважением,

Ответы [ 3 ]

5 голосов
/ 26 февраля 2012

Нет, позиционирование потока основано на шаге byte.Вы можете написать собственную реализацию потока с позиционированием битов.

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;
    }
}
2 голосов
/ 26 февраля 2012

Нет, невозможно продвинуть экземпляр Stream на один бит. Наименьшая гранулярность, поддерживаемая типом Stream, равна единице byte.

Вы можете написать обертку вокруг Stream, которая обеспечивает гранулярность в один бит путем манипулирования и кэширования однобайтового движения.

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

Примечание: это будет считывать байт с правой стороны в биты. Если вы хотите читать слева, вам нужно немного изменить строку return

1 голос
/ 26 февраля 2012

Считать 1 байт и преобразовать его в 8-элементный массив bool, используя битовые маски

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...