2010-05-15 66 views
17

我有一個unsigned char數組,我需要一個std :: string,但我目前的方式使用reinterpret_cast,我想避免。有沒有更乾淨的方法來做到這一點?如何將unsigned char轉換爲不帶reinterpret_cast的std :: string?

unsigned char my_txt[] = { 
    0x52, 0x5f, 0x73, 0x68, 0x7e, 0x29, 0x33, 0x74, 0x74, 0x73, 0x72, 0x55 
} 
unsigned int my_txt_len = 12; 

std::string my_std_string(reinterpret_cast<const char *>(my_txt), my_txt_len); 
+1

爲什麼你不喜歡'reinterpret_cast' ...? – egrunin 2010-05-15 16:40:59

+3

對於強制演員來說,它總是看起來像是黑客,我寧願按照現狀使用,而不是強迫編譯器把它們當作別的東西。 – WilliamKF 2010-05-15 17:43:01

+0

爲什麼不用'char'作爲'my_txt';畢竟,你發佈的這些值是ASCii。這可能會導致解決其他問題。 – 2010-05-15 19:04:26

回答

19

使用迭代器的構造函數:

std::string my_std_string(my_txt, my_txt + my_txt_len); 

這是假設您想要的無符號字符轉換爲字符。如果你想要他們被重新解釋,那麼你應該使用reinterpret_cast。這將是完全乾淨的,因爲你所說的就是做了什麼。

但在您的示例中,它沒有任何區別,因爲數組中的所有值均在範圍0CHAR_MAX之間。所以保證這些值在char中與unsigned char中的表示方式相同,因此重新解釋它們與轉換它們相同。如果您的值大於CHAR_MAX,則允許實現以不同的方式對待它們。

+0

無符號字符被轉換爲字符和他們被'解釋'之間的區別是什麼?作爲字符? – bitek 2013-04-01 12:08:44

+0

@BadDesign:在大多數實現中,它沒有區別,但是在不尋常的架構上可能會有一個。將大於'CHAR_MAX'的值轉換爲char的結果是實現定義的。重新解釋的結果取決於類型的值表示,並不保證與轉換相同。 – 2013-04-01 23:10:00

+0

嗨@steve數組在創建一個字符串之前是否需要一個尾部0? – Noitidart 2017-02-22 22:30:01

7

你試過sstream嗎?

 stringstream s; 
    s << my_txt; 

    string str_my_txt = s.str(); 
+0

它對我很好,不知道爲什麼你說它不起作用? – WilliamKF 2010-05-15 16:43:35

+0

是的 - 你很對!在那裏有一個理由失敗的原因! – 2010-05-15 16:47:36

+2

原來我只是很幸運,在某些情況下,終止NULL的缺失會導致ABR。在這裏看到相關的問題:http://stackoverflow.com/questions/2889074/why-do-i-get-this-strange-output-behavior – WilliamKF 2010-05-22 18:11:00

0
int _tmain(int argc, _TCHAR* argv[]) 
    { 
     unsigned char temp = 200; 
     char temp1[4]; 

     sprintf(temp1, "%d", temp); 

     std::string strtemp(temp1); 

     std::cout<<strtemp.c_str()<<std::endl; 

     return 0; 
    } 
+2

儘管此代碼片段可能會解決問題,包括解釋[真的有幫助](// meta.stackexchange.com/q/114762)以提高帖子的質量。請記住,你正在爲將來的讀者回答這個問題,而不僅僅是現在問的人!請編輯您的答案以添加解釋,並指出適用的限制和假設。 – 2016-11-11 10:56:36

相關問題