CString转字节和字节转CByteArray-MFC

CString To Byte and Byte To CByteArray Conversion-MFC

我尝试在 MFC 中将 CString 转换为 BYTE*` 和 "BYTE* to CByteArray",根据您的建议,CString 已转换为 BYTE*。但我无法将整个字节 * 转换为 CByteArray It Returns 具有一些垃圾值的部分数据。 我在这里描述了我的实际问题...

代码:

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﵄﷽꯽ꮫꮫ"

问题出在这里:

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);

顺便说一句,表达式周围的额外 () 不是必需的。