2012-05-26 32 views

Respuesta

25

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.

+0

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. –

+0

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

-3

QByteArray datagram; datagram.append (ui-> lineEdit_sendData-> text());

+1

¿De qué estás hablando? –

6

A partir de Qt 5.4, QByteArray ha incorporado soporte para std::string conversiones a través de QByteArray::toStdString() y QByteArray::fromStdString().

Estas se implementan de forma casi idéntica a leemes' answer.

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())); } 
Cuestiones relacionadas