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

Était-ce utile?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top