2016-04-17 265 views
1

我正在使用libsodium庫處理pet項目,並發現將unsigned char *轉換爲char *比我想象的更簡單。此外,我首先感到困惑,因爲測試是在釋放模式下傳遞的,稍後我意識到它們沒有以調試模式傳遞。 於是我想出了以下內容:將「unsigned char *」轉換爲「char *」(和字符串)

std::string string_from_uchar(const unsigned char * c, unsigned long long lc) 
    { 
     unsigned char * cc = new unsigned char[lc+1] ; 
     std::strncpy((char *) cc, (char *) c, lc); 
     cc[lc] = 0; 
     char* cr = reinterpret_cast<char *> (cc); 
     std::string ret(cr); 
     delete[](cr); 
     return ret; 
    } 

雖然現在通過測試,我很感激,如果有人可以檢查它是否是這樣做(例如以正確的方式會像另一個環境中工作gcc或clang?)。

+4

不要混合'new'和'free()'。 –

+0

很有可能您的測試因爲某些完全不同的原因而失敗,並且您已實施的修復方案是解決方案,它掩蓋了潛在問題,而不是修復它。 – dasblinkenlight

+0

排序方式:很好! –

回答

5

你在大量思考這個問題。

副本是多餘的,因爲額外的動態分配和添加空終止符(因爲std::string有一個構造函數接受長度參數爲這種情況)。

各種char可以使用別名,所以乾脆:

std::string string_from_uchar(const unsigned char * c, unsigned long long lc) 
{ 
    return std::string((const char*)c, lc); 
} 

事實上,如果你使用任何將範圍的構造函數,你甚至不需要投:

std::string string_from_uchar(const unsigned char * c, unsigned long long lc) 
{ 
    return std::string(c, c + lc); 
} 

它甚至不能保證自己的功能。

+0

我相信只要'std :: string(c,c + lc)'沒有任何強制轉換就行。如我錯了請糾正我。使用那頭野獸已經很長時間了。 :) –

+3

感謝您的例子!你只是忘了'c +';-)。這裏:http://coliru.stacked-crooked.com/a/14f4c576def38129 –

+0

@ Cheersandhth.-Alf:太棒了! –