MFC中CString转BYTE*及BYTE*转CByteArray异常求助
解决MFC中BYTE*转CByteArray出现截断和垃圾值的问题
你遇到的问题核心在于Unicode字符集下CString的字符长度和字节长度的混淆——MFC默认使用Unicode编码,此时CString是基于wchar_t的宽字符类型,每个字符占2字节,但你用csData.GetLength()得到的是字符数,直接用来计算字节数就会导致数据不完整,未填充的内存区域就会出现垃圾值。
问题拆解
你的代码里有两个关键错误:
arrByte2.SetSize(csData.GetLength()+1):这里设置的是字符数+1,但每个宽字符占2字节,CByteArray的实际需要的大小应该是(字符数+1)*sizeof(TCHAR)(TCHAR在Unicode下等价于wchar_t)memcpy(arrByte2.GetData(), pByteArray, csData.GetLength()+1):memcpy的字节数严重不足,只复制了一半的宽字符数据,剩下的内存是未初始化的垃圾值,转成CString自然会乱码。
另外,csData.GetBuffer()之后最好调用ReleaseBuffer()释放缓冲区,虽然这里没修改内容,但保持代码规范能避免潜在问题。
修正后的完整代码
CString csData = _T("someData"); // 1. CString转BYTE*(Unicode下对应宽字符数组的字节形式) int nCharLen = csData.GetLength(); int nByteLen = (nCharLen + 1) * sizeof(TCHAR); // 包含终止符的总字节数 BYTE* pByteArray = reinterpret_cast<BYTE*>(csData.GetBuffer(nCharLen)); csData.ReleaseBuffer(); // 释放缓冲区,保持CString状态正常 // 验证BYTE*转回CString的正确性 CString str(reinterpret_cast<LPTSTR>(pByteArray), nCharLen); AfxMessageBox(str); // 正常显示"someData" // 2. BYTE*转CByteArray CByteArray arrByte2; arrByte2.SetSize(nByteLen); memcpy(arrByte2.GetData(), pByteArray, nByteLen); // 3. CByteArray转回CString CString text(reinterpret_cast<LPTSTR>(arrByte2.GetData()), nCharLen); AfxMessageBox(text); // 现在会完整显示"someData"
额外说明
- 如果你的项目是多字节字符集(MBCS),
TCHAR等价于char,每个字符占1字节,此时你原来的代码可能能正常运行,但现在MFC项目大多默认Unicode,必须严格区分字符长度和字节长度。 - 如果你需要将CString转换为UTF-8等其他编码的字节数组,不能直接强制类型转换,需要用
WideCharToMultiByte这类API做编码转换,不过你的需求是保持原编码的转换,上面的代码就足够了。
内容的提问来源于stack exchange,提问作者srinivasan
相关产品推荐
相关产品推荐

