Visual c++ 在vc+;中将Unicode字节数组转换为CString+;

Visual c++ 在vc+;中将Unicode字节数组转换为CString+;,visual-c++,unicode,mfc,Visual C++,Unicode,Mfc,我有一个大小为2的字节数组,其中包含来自基本多语言平面的单个UTF-16LE编码的Unicode字符 BYTE b[2]; memset(b,0,2); b[0] = 0x31; b[1] = 0x00; //In future this byte contain info when unicode use , but now 0x00. 现在我想将其存储在CString或TCHAR中 编辑 我确实用过 TCHAR tch = (TCHAR)b; //tch = 'X' 这是怎么可能的

我有一个大小为2的字节数组,其中包含来自基本多语言平面的单个UTF-16LE编码的Unicode字符

BYTE b[2];
memset(b,0,2);
b[0] = 0x31;
b[1] = 0x00;   //In future this byte contain info when unicode use , but now 0x00.
现在我想将其存储在
CString
TCHAR

编辑

我确实用过

TCHAR tch = (TCHAR)b;  //tch = 'X'

这是怎么可能的?

您似乎在说您的
字节[2]
数组包含一个用UTF-16表示的Unicode码点(来自基本平面)(或UCS-2-它们相当于基本平面)。在这种情况下,您可以通过以下方式构造一个单字符
CString

CStringW s((wchar_t*)b, 1);


不清楚为什么要使用
BYTE[2]
而不是
wchar\u t
wchar

您似乎在说,您的
BYTE[2]
数组包含一个以UTF-16(或UCS-2-它们相当于基本平面)表示的Unicode码点(来自基本平面)。在这种情况下,您可以通过以下方式构造一个单字符
CString

CStringW s((wchar_t*)b, 1);


现在还不清楚为什么要使用
BYTE[2]
而不是
wchar\u t
wchar

我无法让上述建议的铸造方法发挥作用(与2016年的2015年相比)。以下是我从真正了解MFC的已故Scott McPhillips那里学到的一项技术:

CString str;
LPWSTR strBuf = str.GetBufferSetLength( 4 ); // your b two bytes plus unicode trailing null
::memset( strBuf, 0, 4 ); // make sure the trailing bytes are null
::memcpy_s( strBuf, 2, b, 2 ); // copy over your byte bytes
str.ReleaseBuffer();

我无法让上述建议的铸造方法发挥作用(与2016年的2015年相比)。以下是我从真正了解MFC的已故Scott McPhillips那里学到的一项技术:

CString str;
LPWSTR strBuf = str.GetBufferSetLength( 4 ); // your b two bytes plus unicode trailing null
::memset( strBuf, 0, 4 ); // make sure the trailing bytes are null
::memcpy_s( strBuf, 2, b, 2 ); // copy over your byte bytes
str.ReleaseBuffer();
简单地说:

BYTE recv_buffer[1024];
CString str_recv(recv_buffer);
简单地说:

BYTE recv_buffer[1024];
CString str_recv(recv_buffer);

Protip:
字节b[2]={}
也可以工作,但噪音更小,更容易键入,而且比
memset
安全得多@RogerRowland
CString szString((TCHAR*)b)TCHAR
char
(即,在非Unicode构建中),并且b)
b[1]==0,code>就可以工作。只要这些条件中的任何一个为false,您就试图从指向缓冲区的指针构造一个未以NUL结尾的字符串。
(TCHAR)b
并不像您想象的那样
b
是一个指针(指向数组的第一个元素)
(TCHAR)b
有效地提取所指向地址的低位字节。您的数组恰好位于格式为XXXXXX 58的地址处,因此低阶字节是0x58 aka
'X'
@IgorTandetnik yes,空终止符的优点-我没有注意到。Protip:
字节b[2]={}
也可以工作,但噪音更小,更容易键入,而且比
memset
安全得多@RogerRowland
CString szString((TCHAR*)b)TCHAR
char
(即,在非Unicode构建中),并且b)
b[1]==0,code>就可以工作。只要这些条件中的任何一个为false,您就试图从指向缓冲区的指针构造一个未以NUL结尾的字符串。
(TCHAR)b
并不像您想象的那样
b
是一个指针(指向数组的第一个元素)
(TCHAR)b
有效地提取所指向地址的低位字节。您的数组恰好位于格式为XXXXXX 58的地址处,因此低阶字节是0x58 aka
'X'
@IgorTandetnik yes,关于空终止符的观点很好-我忽略了这一点。