我试图将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﵄﷽ꮫꮫ"
答案 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);
不是必需的。