¿Cuál es la forma correcta de convertir sin pérdida entre std::string y QByteArray… sobre todo para el propósito de la manipulación de datos binarios?

Estoy usando:

QByteArray qba = QString::fromStdString(stdString).toAscii();

y

QString(qba).toStdString();

pero quería comprobar si esto es realmente correcta.

3 Comentarios

  1. 32

    Para los datos binarios que su solución es problemático, ya que los caracteres no ASCII sería convertida en '?' por QString::toAscii(). También existe la sobrecarga innecesaria de UTF-16 de conversión para la representación interna de QString. Como usted puede haber adivinado, QString sólo debe ser usado si los datos es textual, no binario.

    Tanto QByteArray y std::string han constructores de datos raw (C-string + longitud) y también una conversión a C-string + longitud. Así que usted puede utilizar 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 binarias de los seguros, en el sentido de que la cadena puede contener '\0' caracteres y no se trunca. Además, los datos no se tocan (no es UTF conversión), por lo que esta conversión es «sin pérdidas».

    Asegúrese de utilizar los constructores con la longitud como el segundo argumento (por tanto QByteArray y std::string), como la mayoría de los otros constructores se va a truncar los datos antes de la primera aparición de un cero.

    • Gracias. Es importante tener en cuenta que algunos constructores de std::string no necesariamente todos los datos y truncará en el primer byte null.
    • Sí, gracias por agregar esta información, voy a agregar a la respuesta. Pero el constructor con la longitud de su 2do argumento de no truncar.
  2. 12

    Como de Qt 5.4, QByteArray, tiene soporte para std::string conversiones a través de QByteArray::toStdString() y QByteArray::fromStdString().

    Estas son implementadas de manera casi idéntica a leemes respuesta.

    inline std::string QByteArray::toStdString() const
    { return std::string(constData(), length()); }
    
    inline QByteArray QByteArray::fromStdString(const std::string &s)
    { return QByteArray(s.data(), int(s.size())); }

Dejar respuesta

Please enter your comment!
Please enter your name here