No se puede convertir a CString matriz de bytes
Pregunta
Necesito convertir a CString matriz de bytes. No sé por qué, pero todo lo que he encontrado en Internet no funciona :( Por ejemplo, tengo
CString str = _T("string");
He estado tratando por lo 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();
Y siempre pbBuffer contiene simplemente primera letra del str
DWORD dwBufferLen = strlen((char *)pbBuffer)+1;
es 2
Pero si uso const string:
BYTE *pbBuffer = (BYTE*)"string";
pbBuffer contiene cadena entera
¿Dónde está mi error?
Solución
Su CString es Unicode (dos bytes por carácter) y se intenta interpretarlo como ANSI (un byte por carácter). Esto conduce a resultados que no esperas.
En lugar de moldear el búfer subyacente en char*
es necesario convertir los datos. Utilice WideCharToMultiByte () para eso.
Otros consejos
Usted probablemente está compilando con Unicode. Esto significa que su CString contiene wchar_t en lugar de carbón. Convertir un puntero wchar_t a un puntero char hace que se interprete el segundo byte de la primera wchar_t como un terminador de cadena (ya que para el es 0 para los caracteres más comunes)
Cuando se utiliza Visual Studio siempre se debe utilizar _T () para declarar literales de cadena y TCHAR como su tipo de carácter. En su caso:
BYTE* pBuffer = (BYTE*)(LPCTSTR)str;
Se obtiene el buffer, pero todos los demás bytes es más probable que cero.
Utilice un CStringA si necesita una cadena ANSI. (Pero entonces saltar el _T () cuando inicializándola)