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

Posted

技术标签:

【中文标题】在 vc++ 中将 Unicode 字节数组转换为 CString【英文标题】:Convert Unicode byte array to CString in vc++ 【发布时间】:2013-10-04 14:30:03 【问题描述】:

我有一个大小为 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.

现在我想将其存储在 CStringTCHAR 中。

编辑

我确实用过

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

这怎么可能?

【问题讨论】:

专业提示:BYTE b[2] = ; 也同样有效,但噪音更小,更容易打字,而且比memset 安全得多。 试试CString szString((TCHAR*)b); @RogerRowland CString szString((TCHAR*)b); 仅在 a) TCHARchar(即在非 Unicode 版本中)和 b) b[1] == 0 时有效。只要其中任何一个条件为假,您就会尝试从指向非 NUL 终止的缓冲区的指针构造一个字符串。 (TCHAR)b 并不像您认为的那样做。 b 是一个指针(指向数组的第一个元素)。 (TCHAR)b 有效地提取了所指向地址的低位字节。您的数组恰好位于 xxxxxx58 形式的地址,因此低位字节为 0x58 aka 'X' @IgorTandetnik 是的,关于空终止符的好点 - 我错过了。 【参考方案1】:

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

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

CStringW s((wchar_t&)b);

不清楚您为什么一开始就使用BYTE[2] 而不是wchar_tWCHAR

【讨论】:

【参考方案2】:

简单地说:

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

【讨论】:

【参考方案3】:

我无法让上面建议的铸造方法起作用(VS 2015 in 2016)。这是我从真正了解 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();

【讨论】:

以上是关于在 vc++ 中将 Unicode 字节数组转换为 CString的主要内容,如果未能解决你的问题,请参考以下文章

如何在php中将字节数组转换为整数?

在 Swift 中将字节数组转换为 UIImage

VC++中将数字转换成字符串的函数是哪一个?

如何在c ++中将int数组转换为字节数组[重复]

如何在C ++中将字节数组中的整数转换为数字

在C中将无符号短数组转换为字节数组