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++?
Respuesta
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) ;
BYTE * pbData = "SomeString" size_t length = 10 Tengo la longitud anterior, así que utilicé esto: I utilizó este método, "std :: string (reinterpret_cast
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. –
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;
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
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 * –
'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
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.
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);
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
- 1. copia no terminada en nulo matriz de caracteres sin signo a std :: string
- 2. Convertir matriz de caracteres a caracteres sin signo *
- 3. Definir std :: string en C++ sin caracteres de escape
- 4. Cómo convertir System :: String^en std :: string?
- 5. convertir int a std :: string
- 6. Convertir flotador para std :: string en C++
- 7. Cómo convertir std :: string a LPCWSTR en C++ (Unicode)
- 8. Cómo convertir std :: string a NSString?
- 9. convertir std :: string a basic_ostream?
- 10. Cómo convertir std :: string a LPCSTR?
- 11. cómo convertir std :: string a QString
- 12. Cómo convertir std :: string a const char *?
- 13. Cómo convertir QString a std :: string?
- 14. ¿Cómo obtener char sin signo en una std :: string sin reinterpret_cast?
- 15. Conversión de caracteres sin signo a entero con signo
- 16. Cómo convertir char * a corto sin signo en C++
- 17. Cómo convertir largo sin signo a cadena
- 18. Convertir std :: string en QString
- 19. inicializar std :: string de char * sin copia
- 20. C++ copy std :: string a char array sin terminación nula
- 21. Cómo convertir una cadena literal de matriz de caracteres sin signo en Visual C++
- 22. C++ std :: string to boolean
- 23. Cómo convertir CString y :: std :: string :: std :: wstring entre sí?
- 24. Convertir NSString a Largo sin signo
- 25. Cómo convertir char sin signo a NSString en iOS
- 26. Cómo convertir caracteres a enteros en C?
- 27. se desborda al multiplicar caracteres sin signo?
- 28. ¿Cómo convertir NSString a C string?
- 29. ¿Cómo convierto wchar_t * a std :: string? .?
- 30. Cómo agregar un char a std :: string?
C++ no tiene un tipo de bytes, por lo que necesita para decirnos lo que el tipo realmente es. – Yacoby
BYTE resuelve "char sin signo" – Unicorn
¿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? –