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?

¿Fue útil?

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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top