2010-05-15 3 views
17

У меня есть массив unsigned char, который мне нужен в std :: string, но мой текущий способ использует reinterpret_cast, которого я бы хотел избежать. Есть ли более чистый способ сделать это?Способ получения unsigned char в std :: string без reinterpret_cast?

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

+3

Кажется, что это взломать, чтобы заставить бросить, я бы предпочел использовать вещи, а не принуждать комплитера относиться к ним как к чему-то другому. – WilliamKF

+0

Почему бы вам не использовать 'char' для' my_txt'; в конце концов, те значения, которые вы опубликовали, - ASCii. Это может привести к решению других вопросов. –

ответ

19

Используйте конструктор итератора:

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

Это предполагает, что вы хотите неподписанные символы должны быть преобразованы в угле. Если вы хотите их переосмыслить, то вы должны использовать reinterpret_cast. Это было бы совершенно чистым, поскольку то, что вы говорите, именно то, что делается.

В вашем примере это не имеет никакого значения, потому что все значения в вашем массиве находятся в диапазоне 0 до CHAR_MAX. Таким образом, гарантируется, что эти значения представлены одинаково в char, так как они находятся в unsigned char, и, следовательно, их переинтерпретирование - это то же самое, что и их преобразование. Если у вас были значения больше CHAR_MAX, тогда реализациям разрешено обрабатывать их по-разному.

+0

В чем разница между преобразуемым без знака символом char и их интерпретацией, как char? – bitek

+0

@BadDesign: в большинстве реализаций это не имеет никакого значения, но на необычных архитектурах может быть один. Результат преобразования значения, большего, чем 'CHAR_MAX' в char, определяется реализацией. Результат реинтерпретации зависит от представления значений типов и не гарантируется, что он будет таким же, как преобразование. –

+0

Привет @steve Требуется ли массиву для завершения 0 перед тем, как сделать из него строку? – Noitidart

7

Вы пробовали sstream?

 stringstream s; 
    s << my_txt; 

    string str_my_txt = s.str(); 
+0

Он отлично работал для меня, не знаю, почему вы говорите, что он не работает? – WilliamKF

+0

Да, ты совершенно прав !!! Там был кратковременный размах! –

+2

Оказывается, мне просто повезло, отсутствующий завершающий NULL вызывает ABR в некоторых случаях. См. Соответствующий вопрос здесь: http://stackoverflow.com/questions/2889074/why-do-i-get-this-strange-output-behavior – WilliamKF

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), чтобы улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, а не только на человека, который спрашивает сейчас! Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение, и укажите, какие ограничения и допущения применяются. –

Смежные вопросы