BinaryReader - Leer una Sola " POCO "?
-
13-11-2019 - |
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,
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