array ^ TO unsigned char * :: Marshall-Klasse - Interop Ausgabe
-
06-07-2019 - |
Frage
Ich wollte Array konvertieren
//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
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;