CString到字节和字节到CByteArray转换-MFC

Posted

技术标签:

【中文标题】CString到字节和字节到CByteArray转换-MFC【英文标题】:CString To Byte and Byte To CByteArray Conversion-MFC 【发布时间】:2018-05-23 07:08:34 【问题描述】:

我尝试在 MFC 中将 CString 转换为 BYTE*` 和“BYTE* 到 CByteArray”,根据您的建议,CString 已转换为 BYTE*。但我无法将整个 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﵄﷽꯽ꮫꮫ"

【问题讨论】:

LPCSTR, LPCTSTR and LPTSTR的可能重复 你问错问题了。显然,将受控字符序列转换为BYTE* 没有问题。您真正的问题是,您后来未能适当地解释该数据。此外,GetBuffer() 是错误的调用(其中之一,它要求您稍后调用ReleaseBuffer())。你的意思是打电话给GetString。 实际上想要达到什么目的?这看起来有点像XY problem。 【参考方案1】:

问题出在这里:

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(就像您在代码 sn-p 的第一部分中所做的那样)而不是 LPCSTR

str = LPTSTR(pByteArray);

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

【讨论】:

很好的答案,可能值得注意的是第一个零终止了 char*。 感谢@Jabberwocky "str = LPTSTR(pByteArray);",现在字符串已转换。 我已经编辑了我的问题以描述确切的问题。等待您的回复

以上是关于CString到字节和字节到CByteArray转换-MFC的主要内容,如果未能解决你的问题,请参考以下文章

转:CString::GetLength()获得字节数的正确方法

怎样把Cstring转换成wchar

CString 如何转为wchar_t

字节数组转jsonobject(如读取HttpServletRequest.inputstream到jsonobject)

网络字节序的转换函数

在java中如何把字节数组存储到数据库?