2012-02-26 10 views
2

Корпус:
снова пытается захватить пакеты через мой NIC,
Я разработал 2 расширений для использования в поимке переменное число битовBinaryReader - Чтение одиночного «BIT»?

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 Documentation,
Он продвигает позицию потока на 1 BYTE не 1 BIT !!!

Считывает логическое значение из текущего потока и перемещает текущую позиции потока с помощью одного байта .

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

С уважением,

ответ

5

Нет, позиционирование поток основан на 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; 
    } 
} 
+0

Итак, что относительно упорядочения бит? LSB или MSB? –

+1

Здесь вы идете, добавили поддержку bigEndian –

+0

Извините, но _stream.ReadByte(); возвращает Integer !!! –

1

Read 1 байт и завуалированный его 8-элементного BOOL массив с использованием битовых масок

2

Нет, это не возможно, чтобы продвинуть 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

hah мы писали почти тот же код :) –

+1

@PavelKrymets действительно :) – JaredPar