2009-09-23 44 views
2

我有一個字符串,在.Net應用程序中開始,被加密並存儲在AD中。然後它被一個本地C++應用程序拾取並解密以產生一個字節數組 例如,「ABCDEF」變成00,41,00,42,00,43,00,44,00,45,一旦它在C++中被解密結束。MS VC++將字節數組轉換爲BSTR?

我需要把這個字節數組並將其轉換爲BSTR「ABCDEF」,以便我可以在其他地方使用它,我找不到一種方法來實現這最後一步。

任何人都可以幫忙嗎?

回答

0

「解密的字符串」只是一個Unicode字符串 - 拉丁字符包含Unicode時表示的第一個字節等於空。所以你不需要任何真正的轉換,只需要將BSTR從緩衝區中取出即可。

知道Unicode字符的數量 - 它將是緩衝區長度的一半 - 調用SysAllocStringLen()來分配足夠長的以null結尾的未初始化的BSTR。然後將您的數組複製到memcpy()分配的字符串中。或者,您可以撥打SysAllocStringLen()並將字節緩衝區傳遞給它,以便它爲您完成副本並跳過memcpy()。當您不再需要BSTR時,請不要忘記撥打SysFreeString()

+0

爲什麼要創建一個未初始化的字符串,然後複製字符?如果你願意的話,SysAllocStringLen會爲你複製角色。 – 2009-09-23 08:47:15

+0

我認爲推測是角色在某些可以流式傳輸的存儲中;在這種情況下,我們可以通過將源緩衝區直接流入BSTR來避免分配源緩衝區。實際上,在這種情況下這可能並不重要。 – 2009-09-23 08:54:07

+0

@Rob Kennedy:是的,很合理的修正案。 – sharptooth 2009-09-23 09:01:23

1

如果您確實有任意字節數組,請使用SysAllocStringByteLen。但它看起來像,儘管是在一個字節數組中,您的數據實際上是一個UTF-16編碼的Unicode字符串,所以在這種情況下,您最好使用SysAllocStringLen代替。將字節數組指針傳遞給函數(類型轉換爲OLECHAR*),並將字符複製到您的新字符串中,並在末尾添加一個空字符。

+0

感謝您的回答。我已經走了這條路,BSTR中的結果並不是一個有效的Unicode字符串。 我打印BSTR到控制檯我得到了一堆?s(奇怪的是除了空格字符出來正確),正確的數字?s,但不是正確的字符。 假設我已經搞砸了控制檯輸出,我測試了BSTR對應的內容,測試失敗。我使用BSTR newStr = SysAllocStringLen((OLECHAR *)decryptedBytes,dataLength/2);創建字符串。 decryptedBytes數組包含一個有效的字節流00,41 ...等 – user177656 2009-09-23 09:34:33

+1

這可能是一個字節碼問題 - 每個Unicode字符中的字節都會被交換,您需要將它們交換回來。 – sharptooth 2009-09-23 10:05:19

+0

Doh!謝謝,這就是問題所在。現在工作正常:-) – user177656 2009-09-23 10:12:08