BinaryReader – Ein einzelnes „BIT“ lesen?
-
13-11-2019 - |
Frage
Fall :
Ich versuche erneut, Pakete über meine Netzwerkkarte zu erfassen.
Ich habe zwei Erweiterungen entwickelt, die bei der Erfassung einer variablen Anzahl von Bits verwendet werden können
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;
}
Problem :
_BitArray [ Loop ] = Key . ReadBoolean ( );
Da ich versuche, einzelne Bits zu lesen, mich aber darauf beziehe MSDN-Dokumentation,
Es verschiebt die Stream-Position um 1 BYTE, nicht um 1 BIT!!!
Liest einen booleschen Wert aus dem aktuellen Strom und steigt die aktuelle Position des Streams um eins vor Byte.
Frage :
Kann ich wirklich „NUR“ 1 Bit erfassen und die Stream-Position um 1 Bit erhöhen?
Bitte schlagen Sie mir Lösungen oder Ideen vor :)
Grüße,
Lösung
Nein, die Stream-Positionierung basiert auf byte
Schritt.Sie können Ihre eigene Stream-Implementierung mit Bitpositionierung schreiben.
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;
}
}
Andere Tipps
Nein, es ist nicht möglich, a voranzutreiben Stream
Instanz um ein Bit.Die kleinste Granularität Stream
Typ unterstützt ist eins byte
.
Sie könnten einen Wrapper darum schreiben Stream
Dies sorgt für die Ein-Bit-Granularität, indem die Ein-Byte-Bewegung manipuliert und zwischengespeichert wird.
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;
}
}
Notiz:Dadurch wird das Byte von der rechten Seite in Bits gelesen.Wenn Sie von links lesen möchten, müssen Sie das ändern return
Linie ein wenig
Lesen Sie 1 Byte und konvertieren Sie es mit Bitmasken in 8-Element-Bool-Array