BinaryReader - Lendo um único “BIT”?
-
13-11-2019 - |
Pergunta
Caso :
Novamente tentando capturar pacotes através da minha NIC,
Desenvolvi 2 extensões para usar na captura de número variável 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 estou tentando ler bits únicos, mas me referindo a Documentação MSDN,
Ele avança a posição do stream em 1 BYTE e não em 1 BIT !!!
Lê um valor booleano do fluxo atual e avança a posição atual do fluxo por um byte.
Pergunta :
Posso realmente capturar "SOMENTE" 1 bit e avançar a posição do stream em 1 bit?
Por favor, sugira-me soluções ou ideias :)
Cumprimentos,
Solução
Não, o posicionamento do stream é baseado em byte
etapa.Você pode escrever sua própria implementação de fluxo com posicionamento de bits.
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;
}
}
Outras dicas
Não, não é possível avançar um Stream
instância em um bit.A menor granularidade Stream
tipo suporta é um byte
.
Você poderia escrever um invólucro ao redor Stream
que fornece granularidade de um bit, manipulando e armazenando em cache o movimento de um byte.
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;
}
}
Observação:Isso lerá o byte do lado direito em bits.Se você quiser ler da esquerda, precisará alterar o return
linha um pouco
Leia 1 byte e converta-o em um array bool de 8 elementos usando máscaras de bits