CString в байты и байты в CByteArray Conversion-MFC - PullRequest
0 голосов
/ 23 мая 2018

Я пытался преобразовать CString в BYTE * `и« BYTE * в CByteArray »в MFC, с вашими предложениями CString была преобразована в BYTE *.Но я не могу конвертировать весь байт * в CByteArray, он возвращает частичные данные с некоторыми значениями мусора.Я описал мою актуальную проблему здесь ...

Код:

CString csData =_T("someData");

BYTE *pByteArray = (PBYTE)(LPCTSTR)csData.GetBuffer();

CString str;
str=LPTSTR(pByteArray);
AfxMessageBox(str); //returns "someData" 

CByteArray arrByte2;

arrByte2.SetSize(csData.GetLength()+1);

memcpy(arrByte2.GetData(), pByteArray, csData.GetLength()+1);

CString text((LPTSTR)arrByte2.GetData(),arrByte2.GetSize());
CStringA result(text);
AfxMessageBox(text);//returns "some﵄﷽꯽ꮫꮫ"

1 Ответ

0 голосов
/ 23 мая 2018

Проблема здесь:

str = (LPCSTR(pByteArray));

Вы разыгрываете pByteArray в LPCSTR, что на самом деле const char *.Но поскольку ваша программа скомпилирована как программа UNICODE, CString представляет собой строку широких символов (wChar_t), а pByteArray указывает на массив wChar_t (широкие символы или 16-битные символы).Посмотрите на память, указанную pByteArray отладчиком.

Итак, память, указанная pByteArray, выглядит следующим образом:

's', 0, 'o', 0, 'm', 0,  etc.
|-----|
^ this is one wide char     

и не так, как вы ожидаете:

's', 'o', 'm',   etc.

Чтобы исправить, вам нужно привести к LPTSTR (как вы делаете в первой части фрагмента кода), а не к LPCSTR:

str = LPTSTR(pByteArray);

Кстати, лишние () вокруг выражения не нужны.

...