Converti un ‘const wchar_t *’ in ‘unsigned char *’

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 .