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