Frage

Ich wollte Array konvertieren ^ in unsigned char *. Ich habe versucht, zu erklären, was ich getan habe. Ich donot wissen, wie weiter verfahren ist. Bitte zeigen Sie mir den richtigen Ansatz. Ich bin mit 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);

Hier vPnt ist eine Zahl. Aber wie können die Daten von vPublicKey in zu vUnmanagedPublicKey kopieren.

Danke
Raj

War es hilfreich?

Lösung

Versuchen Sie, Ihre letzten beiden Zeilen mit diesem zu ersetzen:

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

Sie haben bereits einen Puffer in nicht verwalteten Speicher zugewiesen den Schlüssel zu, zu kopieren, so dass es keine Notwendigkeit, nicht verwalteten Speicher mit AllocHGlobal zuzuweisen. Sie brauchte nur Ihre nicht verwalteten Zeiger (vUnmanagedPublicKey) auf einen verwalteten Zeiger (IntPtr) zu konvertieren, so dass Marshal :: Copy es benutzen konnten. IntPtr nimmt einen nativen Zeiger als eines der Argumente an den Konstruktor, dass die Umwandlung auszuführen.

So Ihre vollständigen Code wie folgt aussehen könnte:

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);

Andere Tipps

Anstelle der Rangier-API ist es einfacher, nur das verwaltete Array Pin:

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top