2012-05-26 7 views

Antwort

25

Für binäre Daten ist Ihre Lösung problematisch, da Nicht-ASCII-Zeichen durch QString::toAscii() in '?' konvertiert werden. Es gibt auch den unnötigen Overhead der UTF-16-Konvertierung für die interne Darstellung von QString. Wie Sie vielleicht vermutet haben, sollte QString nur verwendet werden, wenn die Daten textuell, nicht binär sind.

Sowohl QByteArray und std::string haben Konstruktoren für Rohdaten (C-string + length) und auch eine Umwandlung in C-string + Länge. So können Sie sie für die Konvertierung verwenden:

// std::string => QByteArray 
QByteArray byteArray(stdString.c_str(), stdString.length()); 

// QByteArray => std::string 
std::string stdString(byteArray.constData(), byteArray.length()); 

Sie sind beide binär sicher, was bedeutet, dass die Zeichenfolge '\0' Zeichen enthalten und nicht abgeschnitten bekommt. Die Daten werden auch nicht berührt (es gibt keine UTF-Konvertierung), daher ist diese Konvertierung "verlustfrei".

Stellen Sie sicher, die Konstruktoren mit der Länge als zweites Argument zu verwenden (für beide QByteArray und std::string), da die meisten anderen Konstruktoren die Daten vor dem ersten Auftreten einer Null abgeschnitten werden.

+0

Danke. Wichtig zu beachten, dass bestimmte Konstruktoren von std :: string nicht unbedingt alle Daten übernehmen und am ersten Null-Byte abgeschnitten werden. –

+0

Ja, danke für das Hinzufügen dieser Informationen, ich werde es der Antwort hinzufügen. Aber der Konstruktor mit der Länge als 2. Argument wird nicht abgeschnitten. – leemes

-3

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

+1

Wovon redest du? –

6

Ab Qt 5.4, QByteArray ist die Unterstützung für std::string Konvertierungen über QByteArray::toStdString() und QByteArray::fromStdString() integriert.

Diese sind fast identisch mit leemes' answer implementiert.

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())); } 
Verwandte Themen