2012-08-24 146 views
0

我可以通過重新解釋演員陣容,大部分時間它被提出,給出了一個警告,所以我想知道是否有其他替代方案(或當然重新演繹演員的清潔實施)如何將unsigned char *的內容轉換爲const char *?

+1

除非您想要複製,'reinterpret_cast'聽起來像是正確的解決方案。 –

+0

複製?在內容中?這正是我想要做的,除非我誤解你的問題。 – Louis93

+1

順便說一句,C++不允許沒有'reinterpret_cast'的轉換的原因是如果'char'有符號而不是2的補碼,那麼對於負數'((unsigned char)* reinterpret_cast (a))!= * a ':也就是說,以char形式讀取數據與從'unsigned char'讀取數據不同。但是這個規則實際上是從C繼承而來的,因爲在C++中,圍繞非2的補碼存在問題,即IIRC意味着'char'需要是無符號的。無論如何,沒有非2的補充C++實現,或者至少沒有你會使用,所以已經注意到這一點,你可以忘記它... –

回答

3

你不說被給予警告什麼,或者什麼問題了,不過鑄造char*reinterpret_cast應無預警工作:

unsigned char *a; 
const char *b = reinterpret_cast<char*>(a); 
0

這取決於你想要做什麼。

如果你只是想訪問的內容作爲char,然後進行簡單 static_cast或使用在一個char預計 會做的伎倆上下文值。

如果您需要將緩衝區傳遞給期望char const*, 的函數reinterpret_cast是唯一的解決方案。

如果你想有一個字符串,使用指針到緩衝區將被罰款:

std::string 
bufferToString(unsigned char const* buffer, size_t length) 
{ 
    return std::string(buffer, buffer + length); 
} 

,或者你可以複製到現有的字符串:

myString.assign(buffer, buffer + length); 
myString.append(buffer, buffer + length); 
// etc. 

任何字符串函數(或算法,像std::copy),可以使用兩個 迭代器。所需要的是取消引用 迭代器會產生一種類型,將其隱​​式轉換爲char,即 的情況爲unsigned char

(不能使用其採取的緩衝區地址和 長度的字符串函數,因爲這些都不是模板,需要緩衝地址 有型char const*。雖然unsigned char轉換隱含 到charunsigned char*需要reinterpret_cast將其轉換爲 至char*。)

相關問題