سؤال

قضية :
أحاول مرة أخرى التقاط الحزم من خلال بطاقة واجهة الشبكة (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 عناصر باستخدام أقنعة البت

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top