array < Byte > ^ TO unsigned char * :: Marshall class - Numéro d'interopérabilité
-
06-07-2019 - |
Question
Je voulais convertir un tableau < Byte > ^ to char non signé *. J'ai essayé d'expliquer ce que j'ai fait. Je ne sais pas comment procéder. S'il vous plaît, montrez-moi la bonne approche. J'utilise 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);
Ici, vPnt est un nombre. Mais comment copier les données de vPublicKey dans vUnmanagedPublicKey.
Merci
Raj
La solution
Essayez de remplacer vos deux dernières lignes par ceci:
Marshal::Copy(vPublicKey, 0, IntPtr(vUnmanagedPublicKey), vPublicKeySize);
Vous avez déjà alloué un tampon dans la mémoire non gérée dans laquelle copier la clé. Il n'est donc pas nécessaire d'allouer de la mémoire non gérée à l'aide d'AllocHGlobal. Vous avez juste besoin de convertir votre pointeur non géré (vUnmanagedPublicKey) en un pointeur géré (IntPtr) afin que Marshal :: Copy puisse l'utiliser. IntPtr prend un pointeur natif comme un des arguments de son constructeur pour effectuer cette conversion.
Votre code complet pourrait donc ressembler à ceci:
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);
Autres conseils
Au lieu d'utiliser l'API marshalling, il est plus facile de simplement épingler le tableau géré:
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;