2010-05-15 11 views
17

Tengo una matriz de caracteres sin signo que necesito en una cadena std ::, pero mi forma actual utiliza reinterpret_cast que me gustaría evitar. ¿Hay una manera más limpia de hacer esto?¿Cómo obtener char sin signo en una std :: string sin 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

¿Y por qué no te gusta 'reinterpret_cast' ...? – egrunin

+3

Siempre parece ser un truco para forzar un yeso, prefiero usar las cosas tal como están en lugar de forzar al compilador a tratarlas como algo más. – WilliamKF

+0

¿Por qué no usas 'char' para' my_txt'; después de todo, esos valores que publicaste son ASCii. Esto puede llevar a resolver otros problemas. –

Respuesta

19

utilizar el constructor iterador:

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

Esto es suponiendo que desea que los caracteres sin signo a ser convertidos a char. Si quiere que los reinterprete, entonces debe usar reinterpret_cast. Eso estaría perfectamente limpio, ya que lo que dices es exactamente lo que se hace.

En su ejemplo, sin embargo, no hace ninguna diferencia, porque todos los valores en su matriz están dentro del rango 0 a CHAR_MAX. Por lo tanto, se garantiza que esos valores se representan de la misma manera en char que en unsigned char, y que la reinterpretación es lo mismo que convertirlos. Si tenía valores superiores a CHAR_MAX, las implementaciones pueden tratarlos de manera diferente.

+0

¿Cuál es la diferencia entre que los caracteres sin firmar se conviertan en caracteres y que sean "interpretados"? como char? – bitek

+0

@BadDesign: en la mayoría de las implementaciones no hace ninguna diferencia, pero en arquitecturas inusuales podría haber una. El resultado de convertir un valor superior a 'CHAR_MAX' en char está definido por la implementación. El resultado de la reinterpretación depende de la representación del valor de los tipos, y no se garantiza que sea lo mismo que la conversión. –

+0

Hola @steve ¿Necesita la matriz 0 antes de crear una cadena? – Noitidart

7

¿Has probado sstream?

 stringstream s; 
    s << my_txt; 

    string str_my_txt = s.str(); 
+0

Funcionó muy bien para mí, no estoy seguro de por qué dices que no funciona? – WilliamKF

+0

Sí, tienes toda la razón! ¡Tuve un momentáneo lapso de razón allí! –

+2

Resulta que estaba teniendo suerte, el NULL de terminación faltante causa ABR en algunos casos. Consulte la pregunta relacionada aquí: 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

Si bien este fragmento de código puede resolver la pregunta, incluyendo una explicación [realmente ayuda] (// meta.stackexchange.com/q/114762) para mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, ¡no solo para la persona que pregunta ahora! Por favor [edite] su respuesta para agregar una explicación y dar una indicación de qué limitaciones y suposiciones se aplican. –

Cuestiones relacionadas