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中。
任何人都可以讓我知道如何避免這種情況?或者有沒有其他方法可以正確地做到這一點?
W2A期望一個以null結尾的字符串,因此它將忽略超出那個空字符的所有內容,所以你不應該得到任何未知的字符。 – sharptooth
@sharptooth謝謝你。有沒有其他的方式或功能,甚至在我可以使用而不是W2A的空字符之後保留所有的東西。即使NUL存在於字符串中,我也希望轉換正確發生。 –
與C字符串不同,BSTR可以包含嵌入的零。這使得它經常被濫用來存儲字節數組而不是字符串。其中已經有一個適當的COM自動化類型,SAFEARRAY。但是如果它實際上是一個字節數組,那麼從Unicode到ANSI的轉換將停止有意義。如果它包含一個0的單個字節,那麼它會失敗,因爲它看起來像轉換例程中的中文字符。在你的代碼中建立關於如何構造緩衝區以及哪些部分*實際*存儲字符串的知識是必需的。 –