مجموعة <بايت> ^ للحرف غير الموقعة * :: فئة مارشال - إمكانية التشغيل المتداخل العدد

StackOverflow https://stackoverflow.com/questions/1012396

سؤال

وكنت أرغب في تحويل مجموعة <بايت> ^ إلى الحرف غير الموقعة *. لقد حاولت أن أشرح ما قمت به. I متأكدا معرفة كيفية المضي قدما. أرجو أن تريني النهج الصحيح. أنا باستخدام MS VC 2005.

//Managed array  
array<Byte>^ vPublicKey = vX509->GetPublicKey();

//Unmanaged array
unsigned char        vUnmanagedPublicKey[MAX_PUBLIC_KEY_SIZE]; 
ZeroMemory(vUnmanagedPublicKey,MAX_PUBLIC_KEY_SIZE);

//MANAGED ARRAY to UNMANAGED ARRAY  

// Initialize unmanged memory to hold the array.  
vPublicKeySize = Marshal::SizeOf(vPublicKey[0]) * vPublicKey->Length;  
IntPtr vPnt = Marshal::AllocHGlobal(vPublicKeySize);

// Copy the Managed array to unmanaged memory.  
Marshal::Copy(vPublicKey,0,vPnt,vPublicKeySize);

وهنا vPnt هو رقم. ولكن كيف يمكن نسخ البيانات من vPublicKey في لvUnmanagedPublicKey.

وشكرا
راج

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

المحلول

وحاول استبدال الخاص بك السطرين الأخيرين مع هذا:

Marshal::Copy(vPublicKey, 0, IntPtr(vUnmanagedPublicKey), vPublicKeySize);

ولقد خصصت بالفعل منطقة عازلة في الذاكرة غير المدارة لنسخ المفتاح، لذلك ليست هناك حاجة لتخصيص الذاكرة غير المدارة باستخدام AllocHGlobal. كنت في حاجة فقط إلى تحويل مؤشر غير المدارة الخاص بك (vUnmanagedPublicKey) إلى مؤشر المدارة (IntPtr) بحيث المارشال :: نسخة يمكن استخدامها. IntPtr يأخذ المؤشر الأصلي باعتبارها واحدة من الحجج لمنشئ لتنفيذ هذا التحويل.

وهكذا التعليمات البرمجية الكاملة يمكن أن ننظر بشيء من هذا القبيل:

array<Byte>^ vPublicKey = vX509->GetPublicKey();
unsigned char        vUnmanagedPublicKey[MAX_PUBLIC_KEY_SIZE]; 
ZeroMemory(vUnmanagedPublicKey, MAX_PUBLIC_KEY_SIZE);

Marshal::Copy(vPublicKey, 0, IntPtr(vUnmanagedPublicKey), vPublicKey->Length);

نصائح أخرى

وبدلا من استخدام التنظيم-API أنه من الأسهل لمجرد دبوس مجموعة تدار:

array<Byte>^ vPublicKey = vX509->GetPublicKey();
cli::pin_ptr<unsigned char> pPublicKey = &vPublicKey[0];

// You can now use pPublicKey directly as a pointer to the data.

// If you really want to move the data to unmanaged memory, you can just memcpy it:
unsigned char * unmanagedPublicKey = new unsigned char[vPublicKey->Length];
memcpy(unmanagedPublicKey, pPublicKey, vPublicKey->Length);
// .. use unmanagedPublicKey
delete[] unmanagedPublicKey;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top