Impossibile convertire CString per array di byte
Domanda
Ho bisogno di convertire CString a matrice Byte. Non so perché, ma tutto quello che ho trovato in internet non funziona :( Ad esempio, ho
CString str = _T("string");
Ho cercato così 1)
BYTE *pbBuffer = (BYTE*)(LPCTSTR)str;
2)
BYTE *pbBuffer = new BYTE[str.GetLength()+1];
memcpy(pbBuffer, (VOID*)(LPCTSTR)StrRegID, str.GetLength());
3)
BYTE *pbBuffer = (BYTE*)str.GetString();
E sempre pbBuffer contiene appena prima lettera del str
DWORD dwBufferLen = strlen((char *)pbBuffer)+1;
è 2
Ma se io uso const string:
BYTE *pbBuffer = (BYTE*)"string";
pbBuffer contiene tutta una serie
Dove è il mio errore?
Soluzione
Il tuo CString è Unicode (due byte per carattere) e si tenta di interpretarlo come ANSI (un byte per carattere). Questo porta a risultati che non ti aspetti.
Invece di lanciare il buffer sottostante in char*
è necessario convertire i dati. Utilizzare WideCharToMultiByte () per questo.
Altri suggerimenti
Probabilmente si sta compilando con unicode. Ciò significa che il CString contiene wchar_t invece di char. Conversione di un puntatore wchar_t a un puntatore char ti fa interpretare il secondo byte del primo wchar_t come terminatore di stringa (dal momento che è 0 per i personaggi più comuni)
Quando si utilizza Visual Studio è necessario utilizzare sempre _T () per dichiarare stringhe letterali e TCHAR come tipo di personaggio. Nel tuo caso:
BYTE* pBuffer = (BYTE*)(LPCTSTR)str;
Si ottiene il buffer, ma ogni altro byte è molto probabilmente pari a zero.
Usa un CStringA se avete bisogno di una stringa ANSI. (Ma poi saltare il _T () durante l'inizializzazione di esso)