【发布时间】:2014-05-06 18:42:09
【问题描述】:
我正在编写使用 com 技术的小型应用程序。我想将 BSTR 字符串转换为无符号字符。为此,我使用 W2A() 宏将 BSTR 转换为 String,然后将 String.C_STR() 复制到 unsigned char 数组。代码sn-p如下:
Send(BSTR *packet, int length)
{
std::string strPacket = W2A(*packet);
unsigned char * pBuffer = new unsigned char [strPacket.length()+1];
memset(pBuffer,0,strPacket.length()+1);
memcpy(pBuffer,strPacket.c_str(),strPacket.length()+1);
}
当 packet 包含普通字符串时,这可以正常工作。但是如果 packet 中包含 NUL 字符,就会出现问题。 pBuffer 中的 NUL 之后出现了一些未知字符,即转换之后。
谁能告诉我如何避免这种情况?或者有没有其他方法可以正确地做到这一点?
【问题讨论】:
-
W2A 需要一个以空字符结尾的字符串,因此它将忽略该空字符以外的所有内容,因此您永远不会收到任何未知字符。
-
@sharptooth 谢谢你。是否有任何其他方式或功能可以保留所有内容,即使在我可以使用而不是 W2A 的空字符之后。即使字符串中存在 NUL,我也希望转换正确发生。
-
与 C 字符串不同,BSTR 可以包含嵌入的零。这使得它经常被滥用来存储字节数组而不是字符串。它已经有一个合适的 COM 自动化类型,一个 SAFEARRAY。但如果它实际上是一个字节数组,那么从 Unicode 转换为 ANSI 就没有意义了。如果它包含一个为 0 的单个字节,则会严重失败,因为在转换例程中它看起来像一个中文字符。在您的代码中建立对缓冲区的结构以及哪些部分实际上存储字符串的认识是必需的。
标签: visual-c++ com