CString到字节和字节到CByteArray Conversion-MFC

时间:2018-05-23 07:08:34

标签: arrays visual-c++ mfc byte c-strings

我试图将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 :(得分:1)

问题在于:

str = (LPCSTR(pByteArray));

您将pByteArray投射到实际为LPCSTR的{​​{1}}。但是,当您的程序编译为UNICODE程序时,const char *是一个宽字符串(CString)和wChar_t指向pByteArray数组(宽字符,或16)位字符)。查看wChar_t使用调试器指向的内存。

所以pByteArray指向的内存如下所示:

pByteArray

并且不像你期望的那样:

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

为了纠正,您需要转换为's', 'o', 'm', etc. (正如您在代码段的第一部分中所做的那样)而不是LPTSTR

LPCSTR

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