Impossible de convertir CString au tableau Byte
Question
Je dois convertir CString au tableau Byte. Je ne sais pas pourquoi, mais tout ce que je trouve dans Internet ne fonctionne pas :( Par exemple, j'ai
CString str = _T("string");
Je l'ai essayé donc 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();
Et toujours pbBuffer ne contient que la première lettre de str
DWORD dwBufferLen = strlen((char *)pbBuffer)+1;
est 2
Mais si j'utilise const string:
BYTE *pbBuffer = (BYTE*)"string";
pbBuffer contient la chaîne entière
Où est mon erreur?
La solution
Votre CString est Unicode (deux octets par caractère) et que vous essayez de l'interpréter comme ANSI (un octet par caractère). Cela conduit à des résultats que vous ne penserez pas.
Au lieu de jeter le tampon sous-jacente en char*
vous devez convertir les données. Utilisez WideCharToMultiByte () pour cela.
Autres conseils
Vous compilez probablement avec unicode. Cela signifie que votre CString contient wchar_t au lieu de char. La conversion d'un pointeur wchar_t à un pointeur char vous fait interpréter le deuxième octet du premier wchar_t comme une terminaison de chaîne (depuis par 0 pour les caractères les plus courants)
Lors de l'utilisation de Visual Studio, vous devriez toujours utiliser _T () pour déclarer les chaînes littérales et TCHAR comme type de caractère. Dans votre cas:
BYTE* pBuffer = (BYTE*)(LPCTSTR)str;
Vous obtenez le tampon, mais tous les autres octets est très probablement zéro.
Utilisez un CStringA si vous avez besoin d'une chaîne ANSI. (Mais sauter le _T () lors de l'initialisation il)