أفضل طريقة لتمثيل صفائف بت في C#؟
-
28-09-2019 - |
سؤال
أقوم حاليًا ببناء فصل 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;
}
إذا تخيلنا أن كل حقل عبارة عن صفيف بتات ثابتة ، فما هو:
- الأكثر نسبة
- افضل تمرين
طريقة لتمثيل هذا كصف ؟؟؟
أو .. كيف تكتب هذا؟ قون
المحلول
أنت على المسار الخطأ مع هذا ، إنه ليس متجهًا قليلاً. يتم تعريف الرسالة في "الثمانيات" ، المعروفة باسم "بايت". إعلان مكافئ 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
هذه قديمة جدًا ، قمت بترحيلها من مدونتي القديمة حتى لا تضيع.