كيفية إرسال dword إلى صفيف بايت في C#
سؤال
كما تعلم بالفعل، فأنا أقوم بالانتقال إلى لغة C# وبعض الأشياء في لغة C++ تبدو مختلفة.
كود سي++
BYTE packetBuffer[32] = {0};
*(LPWORD)(packetBuffer + 0) = 0xC;
*(LPWORD)(packetBuffer + 2) = 0x5000;
*(LPDWORD)(packetBuffer + 6) = dwArgs[13];
*(LPDWORD)(packetBuffer + 10) = *(keyArray2 + 0);
*(LPDWORD)(packetBuffer + 14) = *(keyArray2 + 1);
ملاحظة: dwArgs وkeyArray2 عبارة عن "صفيف DWORD"
هذه هي الطريقة التي يتم وضعها
- سيكون packetbuffer[0] 0xC
- سيكون packetbuffer[1] 0x00
- سيكون حجم Packetbuffer[2] 0x50
- سيكون packetbuffer[3] 0x00
وما إلى ذلك وهلم جرا
كيف نفعل ذلك في C#؟
لقد حاولت هذا، لكنه لا يعمل
packetBuffer[0] = 0xC;
packetBuffer[2] = (byte)0x5000; //error
packetBuffer[6] = (byte)dwArgs[13];
المحلول
يمكنك استخدام BitConverter
لتحويل البيانات من وإلى صفائف البايت.لسوء الحظ لا توجد وسيلة للنسخ إلى مجموعة موجودة.خاصتي EndianBitConverter
في مكتبة MiscUtil يسمح بذلك إذا كنت في حاجة إليه، بالإضافة إلى السماح لك بتحديد مدى الاستخدام بالطبع.(BitConverter
عادة ما يكون endian صغيرًا في .NET - يمكنك التحقق من ذلك باستخدام ملف IsLittleEndian
مجال.)
على سبيل المثال:
EndianBitConverter converter = EndianBitConverter.Little;
converter.CopyBytes((short) 0xc, packetBuffer, 0);
converter.CopyBytes((int) 0x5000, packetBuffer, 2);
converter.CopyBytes(dwArgs[13], packetBuffer, 6);
إلخ.يلقي ل int
في المكالمة الثانية ل CopyBytes
زائدة عن الحاجة، ولكن تم تضمينها للتوضيح (مع الأخذ في الاعتبار السطر السابق!).
يحرر:بديل آخر، إذا كنت تفضل الالتزام بمكتبات .NET القياسية، فقد ترغب في استخدامه BinaryWriter
مع MemoryStream
.
نصائح أخرى
لا يمكنك.يتم كتابة C# بقوة.المتغير له نوع واحد، ونوع واحد فقط.لا يُسمح بالخداع مثل reinterpret_cast C++.
هناك عدة طرق لمشكلتك بالرغم من ذلك.الأول والواضح هو استخدام إطار عمل التسلسل المدمج.لا تهتم بكتابة رمز التسلسل الخاص بك إلا إذا كنت مضطرًا لذلك.وفي .NET، لا يتعين عليك القيام بذلك غالبًا.
والثاني هو استخدام فئة BitConverter (يجب أن تقوم طريقة GetBytes بخدعة التحويل إلى صفيف البايت)