【发布时间】:2009-09-23 08:37:06
【问题描述】:
我有一个以 .Net 应用程序开头的字符串,经过加密并存储在 AD 中。然后它被本地 C++ 应用程序拾取并解密以生成字节数组 例如,“ABCDEF”在 C++ 端解密后变为 00,41,00,42,00,43,00,44,00,45。
我需要获取这个字节数组并将其转换为 BSTR“ABCDEF”,以便我可以在其他地方使用它,但我找不到完成这最后一步的方法。
有人可以帮忙吗?
【问题讨论】:
我有一个以 .Net 应用程序开头的字符串,经过加密并存储在 AD 中。然后它被本地 C++ 应用程序拾取并解密以生成字节数组 例如,“ABCDEF”在 C++ 端解密后变为 00,41,00,42,00,43,00,44,00,45。
我需要获取这个字节数组并将其转换为 BSTR“ABCDEF”,以便我可以在其他地方使用它,但我找不到完成这最后一步的方法。
有人可以帮忙吗?
【问题讨论】:
如果您确实有一个任意字节数组,请使用SysAllocStringByteLen。但看起来,尽管在字节数组中,您的数据实际上是一个 UTF-16 编码的 Unicode 字符串,所以在这种情况下,您最好使用 SysAllocStringLen 代替。将字节数组指针传递给函数(类型转换为OLECHAR*),字符将被复制到新字符串中,并在末尾附加一个空字符。
【讨论】:
“解密的字符串”只是一个 Unicode 字符串 - 当以 Unicode 表示时,拉丁字符包含等于 null 的第一个字节。因此,您不需要任何真正的转换,只需从该缓冲区中提取 BSTR。
知道 Unicode 字符的数量 - 它将是缓冲区长度的一半 - 调用 SysAllocStringLen() 来分配足够长的以空值结尾的未初始化 BSTR。然后使用memcpy() 将您的数组复制到分配的字符串上。或者,您可以调用SysAllocStringLen() 并将字节缓冲区传递给它,以便它为您完成复制并跳过memcpy()。当您不再需要 BSTR 时,不要忘记致电 SysFreeString()。
【讨论】:
SysAllocStringLen 会为您复制字符。