2009-11-04 15 views
30

Tengo unsigned char*, quiero convertirlo a std::string. ¿Puedes decirme la forma más segura de hacer esto?Cómo convertir caracteres sin signo * a std :: string en C++?

+3

C++ no tiene un tipo de bytes, por lo que necesita para decirnos lo que el tipo realmente es. – Yacoby

+1

BYTE resuelve "char sin signo" – Unicorn

+3

¿Y qué hay de 'Byte'? Y, lo que es más importante, ¿a qué apunta el puntero? ¿Un único valor de 'Byte' o una matriz de' Byte'? ¿Qué quiere en su cadena: una representación textual del valor del puntero o cadena que representa los valores de los objetos apuntados? –

Respuesta

48

Sólo necesario para emitir el unsigned char en un char como la clase de cadena no tiene un constructor que acepta unsigned char:

unsigned char* uc; 
std::string s(reinterpret_cast< char const* >(uc)) ; 

Sin embargo, tendrá que utilizar el argumento de longitud en el constructor si su matriz de bytes contiene valores nulos, como si yo u no sólo una parte de la matriz va a terminar en la cadena (la matriz hasta el primer nulo)

size_t len; 
unsigned char* uc; 
std::string s(reinterpret_cast<char const*>(uc), len) ; 
+0

BYTE * pbData = "SomeString" size_t length = 10 Tengo la longitud anterior, así que utilicé esto: I utilizó este método, "std :: string (reinterpret_cast (pbData), length);" Funciona, pero de vez en cuando veo un bloqueo en memcpy. Tryint para encontrar nuestro por qué se produjo el bloqueo, aunque parece funcionar para mí – Unicorn

+3

Como pedante de portabilidad, quiero señalar que esto solo funciona en sistemas con aritmética de complemento de 2. En el complemento de 1 o arquitecturas de magnitud de signo, no es seguro reinterpretar_cast entre 'char *' y 'unsigned char *' (bueno, es seguro, pero obtendrá resultados sorprendentes si 'char' está firmado y cualquiera de los caracteres tener el bit superior establecido). En este caso, el que pregunta está obviamente en Windows, así que no hay problema. –

3
BYTE *str1 = "Hello World"; 
std::string str2((char *)str1); /* construct on the stack */ 

alternativa:

std::string *str3 = new std::string((char *)str1); /* construct on the heap */ 
cout << &str3; 
delete str3; 
+0

No funciona, aparece un error que dice "'std :: basic_string <_Elem, _Traits, _Ax> :: basic_string (const std :: allocator <_Ty> &)': no ​​se puede convertir el parámetro 1 de 'BYTE *' a 'const std :: allocator <_Ty> & '" – Unicorn

+1

Eso es porque' std :: string' no tiene un constructor que tome un 'unsigned char *', y entonces el compilador recurre al constructor con plantilla destinado a los asignadores. Necesita usar 'std :: string (Iterator begin, Iterator end)', o 'std :: string (const char *, std :: size_t n)' y convertir el BYTE * a un char * –

+4

'std: : string & str3 = new ... ', ¿no quisiste decir' * 'en lugar de' & '? Y, por cierto, la creación de std :: string en el montón generalmente es mala idea y derrota a la mitad el propósito de tener una clase de cadena con semántica de valores. – sbk

5

BYTE* es probablemente un typedef para unsigned char*, pero no puedo decir con seguridad. Sería útil si nos diga qué es BYTE.

Si BYTE * no tiene firma char *, puede convertirlo a std :: cadena utilizando std :: string range constructor, que tomará dos Iteradores genéricos.

const BYTE* str1 = reinterpret_cast<const BYTE*> ("Hello World"); 
int len = strlen(reinterpret_cast<const char*>(str1)); 
std::string str2(str1, str1 + len); 

Dicho esto, ¿está seguro de que esta es una buena idea? Si BYTE es unsigned char, puede contener caracteres que no sean ASCII, que pueden incluir valores NULL. Esto hará que strlen den una longitud incorrecta.

2

BYTE es nada más que typedef unsigned char BYTE;

Usted puede utilizar fácilmente cualquiera de los constructores por debajo

string (const char * s, size_t n); 
string (const char * s); 
0

Si tiene acceso a CryptoPP

legible Hex String para unsigned char

std::string& hexed = "C23412341324AB"; 
uint8_t  buffer[64] = {0}; 
StringSource ssk(hexed, true, 
      new HexDecoder(new ArraySink(buffer,sizeof(buffer)))); 

Y de vuelta

std::string hexed; 
uint8_t val[32] = {0}; 
StringSource ss(val, sizeof(val), true,new HexEncoder(new StringSink(hexed)); 
// val == buffer 
Cuestiones relacionadas