In C ++ è ansible convertire un ‘const wchar_t *’ in ‘unsigned char *’?
Come lo posso fare?
wstring dirName; unsigned char* dirNameA = (unsigned char*)dirName.c_str(); // I am creating a hash from a string hmac_sha256_init( hash, (unsigned char*)dirName.c_str(), (dirName.length)+1 );
Devi convertire carattere per carattere. Ci sono funzioni come wcstombs
per farlo.
Prova a utilizzare reinterpret_cast. Così:
unsigned char * dirNameA = reinterpret_cast(dirName.c_str());
Potrebbe non funzionare perché c_str restituisce un const wchar_t * in modo da poter provare anche:
unsigned char * dirNameA = reinterpret_cast( const_cast(dirName.c_str()) );
Questo funziona perché hmac_sha256_init dovrebbe accettare un blob binario come suo input, quindi la stringa unicode contenuta in dirName è un input hash accettabile.
Ma c’è un bug nel codice: la lunghezza restituita da dirName.length () è un conteggio di caratteri, non un conteggio di byte. Ciò significa che passare troppo pochi byte a hmac_sha256_init dato che stai passando una stringa unicode come un blob binario, quindi devi moltiplicare (dirName.length ()) per 2.
Dal momento che stai usando WinAPI, usa WideCharToMultiByte
.