Pergunta

Eu queria converter array ^ para unsigned char *. Tentei explicar o que eu tenho feito. I donot saber como prosseguir. Por favor, mostre-me o caminho certo. Estou usando o 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);

Aqui VPNT é um número. Mas como pode copiar os dados do vPublicKey para vUnmanagedPublicKey.

Obrigado
Raj

Foi útil?

Solução

Tente substituir suas últimas duas linhas com o seguinte:

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

Você já alocado um buffer na memória não gerenciada para copiar a chave para, por isso não há necessidade de alocar a memória não gerenciado usando AllocHGlobal. Você só precisava converter o ponteiro não gerenciado (vUnmanagedPublicKey) para um ponteiro gerenciado (IntPtr) para que Marshal :: Copiar poderia usá-lo. IntPtr leva um ponteiro nativo como um dos argumentos para o construtor para realizar essa conversão.

Portanto, o seu código completo pode ser algo como isto:

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

Outras dicas

Em vez de usar a triagem-API é mais fácil apenas fixar a matriz geridos:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top