Pregunta

Quería convertir la matriz < Byte > ^ a unsigned char *. He tratado de explicar lo que he hecho. No sé cómo seguir adelante. Por favor muéstrame el enfoque correcto. Estoy usando 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);

Aquí vPnt es un número. Pero, ¿cómo puede copiar los datos de vPublicKey en vUnmanagedPublicKey.

Gracias
Raj

¿Fue útil?

Solución

Intente reemplazar sus dos últimas líneas con esto:

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

Ya ha asignado un búfer en la memoria no administrada para copiar la clave, por lo que no es necesario asignar memoria no administrada utilizando AllocHGlobal. Solo necesitaba convertir su puntero no administrado (vUnmanagedPublicKey) en un puntero administrado (IntPtr) para que Marshal :: Copy pudiera usarlo. IntPtr toma un puntero nativo como uno de los argumentos a su constructor para realizar esa conversión.

Entonces su código completo podría verse más o menos así:

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

Otros consejos

En lugar de utilizar la API de cálculo de referencias, es más fácil fijar el conjunto administrado:

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top