2017-11-22 12 views
0

Ich versuche zu verstehen, wie QByteArray und String in qt zusammenarbeiten. Also habe ich den folgenden Fall, wo ich ein QByteArray im Speicher erstellen.Erhalten eines QByteArray von einem QString

QByteArray qba; 
quint8 version = 1; 
qba << version; 
quint8 type = 122; 
qba << type; 

qDebug() << qba.length() << " " << QString(qba); 

Die Debug-Anweisung druckt:

2 "\u0001z" 

So habe ich 2 Byte Daten und die String-Darstellung extrahiert wird.

Nun, was ich tun möchte, ist mit der String-Darstellung zu beginnen (die mir als eine rohe C++ Char-Array gegeben wird) und erstellen Sie die QByteArray Darstellung. So schaffe ich das Array wie folgt:

char msg[] = { '\\', 'u', '0', '0', '0', '1', 'z', '\0' }; 
QString testStr = QString::fromUtf8(msg); 
QByteArray testRaw = testStr.toUtf8(); 
qDebug() << testRaw.length() << " " << QString(testRaw); 

nun diese Drucke:

7 "\\u0001z" 

Ich bin nicht sicher, wie ich aus einem solchen Zeichenfeld beginnen und die Byte-Array-Darstellung erhalten. Ich bin nicht sicher, ob dies ein String-Codierung Problem ist, aber ich konnte diese Binärdarstellung nicht neu erstellen, unabhängig davon, welche String Methode, die ich versuchte (fromLatin1, fromUtf16 etc.)

ich verwende Qt 5.9

+0

ich geschrieben habe antworte direkt nach deiner Bearbeitung. Jetzt sehe ich, dass deine Frage nicht präzise ist. Warum brauchst du diese Konvertierung, was du damit machen musst? –

+0

Ich brauche diese Konvertierung, weil ich eine Bibliothek libdmtx benutze, die Datenmatrix-Bilder dekodiert. Der Decoder gibt ein 'const char *' zurück und ich versuche, die binäre Darstellung im Grunde zu erhalten, um sie zu parsen. Ich nehme an, die zurückgegebene Zeichenfolge ist UTF-8 kodiert, aber ich bin mir nicht sicher. Die Dokumentation von ihnen sagt nichts. Im Moment versuche ich nur zu reproduzieren, wie ich zwischen QByteArray und const char * hin und her gehen kann, da ich die Codierung kenne. – Luca

Antwort

0

Konvertierung zwischen QString und QByteArray hängt von der Codierung ab! Ihre QString(qba) setzt voraus, dass die Daten UTF-8-codiert sind, siehe QString documentation.

In anderer Richtung Sie haben:

Am so weiter, gibt es auch umgekehrt statische Methoden.


Beachten Sie, dass qDebug() << anyString; keine Daten drucken wahrsten Sinne des Wortes, sondern in Form für Entwickler, das ist, warum es mit Zitaten und nicht druckbare Zeichen umgeben wurde „\ U0001“ umgewandelt


QByteArray qba; 
quint8 version = 1; 
qba << version; 
quint8 type = 122; 
qba << type; 

// character '\1' is not printable, so qDebug do a developer friendly conversion 
qDebug() << qba.length() << " " << QString(qba); 

// to revert conversion, you code should look like this: 
QString convnerted(qba); 
QByteArray reverted = convnerted.toUtf8(); 

Q_ASSERT(reverted == qba); 
+0

Danke für die Antwort. Also, ja, der QString (qba) gab mir eine utf-8-Darstellung, denke ich. Also habe ich versucht, das gleiche im Speicher (im zweiten Teil des Codes) zu tun. Warum konnte ich das QByteArray nicht wiederherstellen? Ich dachte, die Zeile 'QString testStr = QString :: fromUtf8 (msg);' würde mir die gleiche Darstellung geben. – Luca

+0

welche Version von Qt? Qt4 hat in dieser Hinsicht ein unterschiedliches Verhalten. –

+0

Ja, aber das konvertierte QByteArray hat nicht die gleiche Länge, d. H. 2 vs 7. Also ist etwas in der Darstellung der Zeichenkette falsch gelaufen. – Luca