Pregunta

Caso :
De nuevo tratando de capturar los paquetes a través de mi NIC,
He desarrollado 2 Extensiones para utilizar en la captura de número variable de 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;
    }

Problema :

_BitArray [ Loop ] = Key . ReadBoolean ( );  

Como estoy tratando de leer un bit, pero refiriéndose a Documentación de MSDN,
Avanza el flujo de la posición por 1 BYTE 1 BIT !!!

Lee un valor Booleano de la corriente de secuencia y los avances de la actual la posición de la corriente por uno byte.

Pregunta :
Puedo captar realmente "SÓLO" 1 Bit y avanzar en el flujo de la posición por 1 Bit ?
Por favor, me sugieren soluciones o ideas :)

Saludos,

¿Fue útil?

Solución

No, Flujo de posicionamiento se basa en byte paso.Usted puede escribir su propio flujo de la aplicación con bits de posicionamiento.

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

Otros consejos

No, no es posible avanzar en un Stream instancia por un bit.El más pequeño de la granularidad de la Stream tipo de apoyos es una byte.

Podría escribir un contenedor Stream que proporciona el bit de granularidad mediante la manipulación y el almacenamiento en caché de un byte movimiento.

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

Nota:Esto va a leer el byte de la derecha dentro de bits.Si queréis leer desde la izquierda que había necesidad de cambiar el return línea un poco

Leer 1 byte y convertirlo en la matriz BOOL de 8 elementos usando máscaras de bits

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top