Para los datos binarios su solución es problemática ya que los caracteres no ASCII se convertirían a '?'
por QString::toAscii()
. También está la sobrecarga innecesaria de la conversión UTF-16 para la representación interna de QString
. Como habrás adivinado, QString
solo debe usarse si los datos son textuales, no binarios.
Tanto QByteArray
y std::string
tienen constructores para datos en bruto (C-string + longitud) y también una conversión a C-string + longitud. Para que pueda utilizarlos para la conversión:
// std::string => QByteArray
QByteArray byteArray(stdString.c_str(), stdString.length());
// QByteArray => std::string
std::string stdString(byteArray.constData(), byteArray.length());
Ambos son binario seguro, lo que significa que la cadena puede contener caracteres '\0'
y no se truncan. Los datos tampoco se tocan (no hay conversión UTF), por lo que esta conversión es "sin pérdidas".
Asegúrese de utilizar los constructores con la longitud como segundo argumento (para ambos QByteArray
y std::string
), ya que la mayoría de los otros constructores truncarán los datos antes de la primera aparición de un cero.
Gracias. Es importante tener en cuenta que ciertos constructores de std :: string no tomarán necesariamente todos los datos y se truncarán en el primer byte nulo. –
Sí, gracias por agregar esta información, la agregaré a la respuesta. Pero el constructor con la longitud como su segundo argumento no se truncará. – leemes