【问题标题】:MS VC++ Convert a byte array to a BSTR?MS VC++ 将字节数组转换为 BSTR?
【发布时间】:2009-09-23 08:37:06
【问题描述】:

我有一个以 .Net 应用程序开头的字符串,经过加密并存储在 AD 中。然后它被本地 C++ 应用程序拾取并解密以生成字节数组 例如,“ABCDEF”在 C++ 端解密后变为 00,41,00,42,00,43,00,44,00,45。

我需要获取这个字节数组并将其转换为 BSTR“ABCDEF”,以便我可以在其他地方使用它,但我找不到完成这最后一步的方法。

有人可以帮忙吗?

【问题讨论】:

    标签: c++ bytearray bstr


    【解决方案1】:

    如果您确实有一个任意字节数组,请使用SysAllocStringByteLen。但看起来,尽管在字节数组中,您的数据实际上是一个 UTF-16 编码的 Unicode 字符串,所以在这种情况下,您最好使用 SysAllocStringLen 代替。将字节数组指针传递给函数(类型转换为OLECHAR*),字符将被复制到新字符串中,并在末尾附加一个空字符。

    【讨论】:

    • 感谢您的回答。我已经走上了这条路,最终在 BSTR 中的不是有效的 unicode 字符串。当我将 BSTR 打印到控制台时,我得到一堆 ?s(奇怪的是,除了正确输出的空格字符),正确数量的 ?s 但不是正确的字符。假设我搞砸了控制台输出,我测试了 BSTR 与那里应该存在的内容,但测试失败了。我正在使用 BSTR newStr = SysAllocStringLen((OLECHAR *)decryptedBytes, dataLength/2);创建字符串。 decryptedBytes 数组确实包含有效的字节流 00,41... 等
    • 这可能是字节顺序问题 - 每个 Unicode 字符中的字节都被交换了,您需要将它们交换回来。
    • 噢!谢谢,就是这个问题。现在工作正常:-)
    【解决方案2】:

    “解密的字符串”只是一个 Unicode 字符串 - 当以 Unicode 表示时,拉丁字符包含等于 null 的第一个字节。因此,您不需要任何真正的转换,只需从该缓冲区中提取 BSTR。

    知道 Unicode 字符的数量 - 它将是缓冲区长度的一半 - 调用 SysAllocStringLen() 来分配足够长的以空值结尾的未初始化 BSTR。然后使用memcpy() 将您的数组复制到分配的字符串上。或者,您可以调用SysAllocStringLen() 并将字节缓冲区传递给它,以便它为您完成复制并跳过memcpy()。当您不再需要 BSTR 时,不要忘记致电 SysFreeString()

    【讨论】:

    • 为什么要创建一个未初始化的字符串,然后再复制字符?如果您允许,SysAllocStringLen 会为您复制字符。
    • 我认为假设是字符在一些可以流式传输的存储中;在这种情况下,我们可以通过将源缓冲区直接流式传输到 BSTR 来避免分配源缓冲区。实际上,在这种特殊情况下,这可能无关紧要。
    • @Rob Kennedy:是的,相当合理的修改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 2011-04-08
    • 2010-09-15
    • 2013-05-12
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    相关资源
    最近更新 更多