Conversione della matrice di byte gestita in stringa non gestita
-
13-12-2019 - |
Domanda
Sto cercando di convertire un array di byte gestito su Std :: String nel mio wrapper C ++ / CLI;Tuttavia, sto vedendo un po 'di memoria corrotta nell'heap più tardi.Volevo solo controllare se sto facendo la conversione destra.Sotto è il mio metodo è cli:
string ByteArrayToStr(array<Byte>^ byteArray)
{
int size = byteArray.Length;
IntPtr pnt = Marshal::AllocHGlobal(size + 1);
char* chararray = (char*)pnt.ToPointer();
try
{
Marshal::Copy(byteArray, 0, pnt, size);
*(chararray + size) = 0;
return string(chararray);
}
finally
{
Marshal::FreeHGlobal(pnt);
}
}
.
Qualcosa sembra sbagliato nel codice sopra?
Soluzione
Si esegue una copia esplicita inutile e la riproduzione con un'allocazione manuale della memoria.
È possibile passare il Puntatore Pinned Raw al costruttore std::string
:
string ByteArrayToStr(array<Byte>^ byteArray)
{
pin_ptr<unsigned char> temp = &byteArray[0];
return string(reinterpret_cast<char*>(temp), byteArray->Length);
}
. Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow