سؤال

أقوم حاليًا ببناء فصل DHCPMessage في C#.

RFC متاح هنا: http://www.faqs.org/rfcs/rfc2131.html

مستعار

public object DHCPMessage
{
    bool[8] op;
    bool[8] htype;
    bool[8] hlen;
    bool[8] hops;
    bool[32] xid;
    bool[16] secs;
    bool[16] flags;
    bool[32] ciaddr;
    bool[32] yiaddr;
    bool[32] siaddr;
    bool[32] giaddr;
    bool[128] chaddr;
    bool[512] sname;
    bool[1024] file;
    bool[] options;
}

إذا تخيلنا أن كل حقل عبارة عن صفيف بتات ثابتة ، فما هو:

  1. الأكثر نسبة
  2. افضل تمرين

طريقة لتمثيل هذا كصف ؟؟؟

أو .. كيف تكتب هذا؟ قون

هل كانت مفيدة؟

المحلول

أنت على المسار الخطأ مع هذا ، إنه ليس متجهًا قليلاً. يتم تعريف الرسالة في "الثمانيات" ، المعروفة باسم "بايت". إعلان مكافئ C# يمكنك استخدامه مع Marshal.PtrtoStructure هو:

    [StructLayout(LayoutKind.Sequential, Pack=1, CharSet=CharSet.Ansi)]
    struct DHCPMessage {
        public byte op;
        public byte htype;
        public byte hlen;
        public byte hops;
        public uint xid;
        public ushort secs;
        public ushort flags;
        public uint ciaddr;
        public uint yiaddr;
        public uint siaddr;
        public uint giaddr;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst=16)]
        public byte[] chaddr;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=64)]
        public string sname;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)]
        public string file;
    }

ستحتاج إلى التعامل مع حقل خيارات الطول المتغير بشكل منفصل.

نصائح أخرى

للمبتدئين ، يمكنك تجربة Bitarray صف دراسي. لا حاجة لإعادة اختراع العجلة هنا.

إذا كنت قلقًا بشأن ذلك ، فلا تقم ببعض المساحة/الذاكرة ، فلا تكون كذلك. فقط قم بتهيئته إلى الحجم الصحيح:

BitArray op = new BitArray(8);

(ما سبق سيحتوي على 8 بتات ويجب أن يأخذ بايت واحد)

هل أنت متأكد من أنك تريد استخدام صفائف بت لبعض هذه؟ على سبيل المثال ، يمكنك استخدام Byte لـ 8 بتات ، و INT لـ 32 بت ، ومصفوفات بايت للقطع التي تخطط لخريطة خريطة لإنهاء السلاسل مثل "sname" على سبيل المثال. ثم يمكنك استخدام مشغلات Bitwise البسيطة (& ، |) للتحقق/معالجة البتات.

فيما يلي بعض المنشورات التي قمت بها حول تحويل رأس TCP إلى هيكل ، والذي يغطي أيضًا Endianness وما إلى ذلك.

http://taylorza.blogspot.com/2010/04/archive-structure-from-binary-data.html http://taylorza.blogspot.com/2010/04/archive-binary-data-from-structure.html

هذه قديمة جدًا ، قمت بترحيلها من مدونتي القديمة حتى لا تضيع.

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