2014-04-29 31 views
0

我正在寫使用com技術的小型應用程序。我想將BSTR字符串轉換爲無符號字符。爲此,我使用W2A()宏將BSTR轉換爲String,然後將String.C_STR()複製到unsigned char數組中。的代碼片段如下:如何將BSTR字符串轉換爲Unsigned Char(在應用程序中使用com技術)

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); 
} 

這工作得很好,當含有正常的字符串。但是,如果數據包包含NUL字符,則會出現問題。一些未知字符出現在NUL之後,即在轉換後出現在pBuffer中。

任何人都可以讓我知道如何避免這種情況?或者有沒有其他方法可以正確地做到這一點?

+0

W2A期望一個以null結尾的字符串,因此它將忽略超出那個空字符的所有內容,所以你不應該得到任何未知的字符。 – sharptooth

+0

@sharptooth謝謝你。有沒有其他的方式或功能,甚至在我可以使用而不是W2A的空字符之後保留所有的東西。即使NUL存在於字符串中,我也希望轉換正確發生。 –

+1

與C字符串不同,BSTR可以包含嵌入的零。這使得它經常被濫用來存儲字節數組而不是字符串。其中已經有一個適當的COM自動化類型,SAFEARRAY。但是如果它實際上是一個字節數組,那麼從Unicode到ANSI的轉換將停止有意義。如果它包含一個0的單個字節,那麼它會失敗,因爲它看起來像轉換例程中的中文字符。在你的代碼中建立關​​於如何構造緩衝區以及哪些部分*實際*存儲字符串的知識是必需的。 –

回答

0

BSTR是Windows API類型,必須使用API​​宏或函數進行管理。如果你不能使用W2A宏,因爲你的字符串裏面可能有空字符,你必須使用WideCharToMultiByte函數,它可以從BSTR的寬字符轉換爲char *的窄字符。一定要有SDK文檔。或者,你可以讓你的程序使用WCHARs

相關問題