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?

È stato utile?

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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top