سؤال

كما تعلم بالفعل، فأنا أقوم بالانتقال إلى لغة 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"

هذه هي الطريقة التي يتم وضعها

  1. سيكون packetbuffer[0] 0xC
  2. سيكون packetbuffer[1] 0x00
  3. سيكون حجم Packetbuffer[2] 0x50
  4. سيكون 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 بخدعة التحويل إلى صفيف البايت)

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