BinaryReader - قراءة "BIT" واحدة؟
-
13-11-2019 - |
سؤال
قضية :
أحاول مرة أخرى التقاط الحزم من خلال بطاقة واجهة الشبكة (NIC) الخاصة بي،
لقد قمت بتطوير امتدادين لاستخدامهما في التقاط عدد متغير من البتات
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,
إنه يتقدم موضع الدفق بمقدار 1 BYTE وليس 1 BIT !!!
يقرأ قيمة منطقية من الدفق الحالي ويطور الموضع الحالي للتيار بايت.
سؤال :
هل يمكنني حقًا التقاط 1 بت "فقط" وتعزيز موضع الدفق بمقدار 1 بت؟
أرجو أن تقترحوا لي حلولاً أو أفكارًا :)
يعتبر،
المحلول
لا، يعتمد تحديد موقع الدفق على 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;
}
}
نصائح أخرى
لا ليس من الممكن التقدم أ 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
الخط قليلا
قراءة بايت واحد وتحويله إلى مصفوفة منطقية مكونة من 8 عناصر باستخدام أقنعة البت