const unsigned char * to std:: string


Sqlite3_column_text devuelve un carácter const sin signo*, ¿cómo convertir esto a una cadena std::? He intentado std:: string(), pero recibo un error.

Código:

temp_doc.uuid = std::string(sqlite3_column_text(this->stmts.read_documents, 0));

Error:

1>.\storage_manager.cpp(109) : error C2440: '<function-style-cast>' : cannot convert from 'const unsigned char *' to 'std::string'
1>        No constructor could take the source type, or constructor overload resolution was ambiguous
 34
Author: LM., 2009-04-30

9 answers

Puedes intentar:

temp_doc.uuid = std::string(reinterpret_cast<const char*>(
      sqlite3_column_text(this->stmts.read_documents, 0)
  ));

Mientras que std::string podría tener un constructor que toma const unsigned char*, aparentemente no lo hace.

¿Por qué no, entonces? Podría echar un vistazo a esta pregunta algo relacionada: ¿Por qué los flujos de C++ usan char en lugar de char sin signo?

 41
Author: Reunanen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:34

En la remota posibilidad de que realmente desee una cadena de caracteres sin signo, puede crear su propio tipo:

typedef std::basic_string <unsigned char> ustring;

Entonces deberías ser capaz de decir cosas como:

ustring s = sqlite3_column_text(this->stmts.read_documents, 0);
 18
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-29 20:46:53

La razón por la que las personas suelen usar un tipo (unsigned char *) es para indicar que los datos son binarios y no texto ASCII simple. Sé que libxml hace esto, y por lo que parece, sqlite está haciendo lo mismo.

Los datos que está recibiendo de la llamada sqlite es probablemente texto Unicode codificado en UTF-8. Si bien un reinterpret_cast puede parecer que funciona, si alguien alguna vez almacena texto en el campo que no es ASCII simple, su programa probablemente no se comportará bien.

La cadena std:: class no está diseñada con Unicode en mente, así que si preguntas por la longitud() de una cadena, obtendrás el número de bytes, que, en UTF-8, no es necesariamente lo mismo que el número de caracteres.

Respuesta corta: el cast simple puede funcionar, si está seguro de que los datos son solo ASCII. Si puede ser cualquier dato UTF-8, entonces necesita manejar la codificación/decodificación de una manera más inteligente.

 14
Author: Mike Mueller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-30 23:25:03

No estoy familiarizado con sqlite3_column_text, pero una cosa que puede querer hacer es cuando llama al constructor std:string, querrá convertir a (const char*). Creo que debería tener un constructor para ese tipo.

Sin embargo, es extraño que esta función sqlite devuelva un char sin signo*, ¿está devolviendo una cadena Pascal (el primer char es la longitud de la cadena)? Si es así, entonces tendrás que crear la cadena std::con los bytes y la longitud.

 4
Author: Lyndsey Ferguson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-29 20:33:52

Intenta:

temp_doc.uuid = std::string(reinterpret_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0)));
 3
Author: user88637,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-29 20:40:30

Si temp_doc.uuid es una cadena std:: try:

temp_doc.uuid = static_cast<const char*>(sqlite3_column_text(this->stmts.read_documents, 0));
 2
Author: Raoul Supercopter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-29 20:34:20

No puedes construir un std::string desde c onst unsigned char* first primero tienes que lanzarlo a const char*:

temp_doc.uuid = std::string( reinterpret_cast< const char* >(
  sqlite3_column_text(this->stmts.read_documents, 0) ) );
 2
Author: Kasprzol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-29 20:44:06

No soy un experto, pero este ejemplo aquí parece mucho más simple:

string name = (const char*) (sqlite3_column_text(res, 0));
 2
Author: still_learning,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-15 17:12:10

Una pregunta antigua pero importante, si tiene que preservar la información completa en la secuencia de caracteres sin signo. En mi opinión, con reinterpret_cast no es el caso. Encontré una solución interesante bajo convertir cadena a vector que he modificado a

basic_string<unsigned char> temp = sqlite3_column_text(stmt, 0);
string firstItem( temp.begin(), temp.end() );

Ya que estoy programando para gtkmm, puede realizar la conversión en un Glib:: ustring con

basic_string<unsigned char> temp = sqlite3_column_text(stmt, 0);
Glib::ustring firstItem = string( temp.begin(), temp.end() );
 0
Author: Erich Kuester,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-30 17:53:21