QDataStream Class
Die Klasse „QDataStream“ ermöglicht die Serialisierung binärer Daten in einen „ QIODevice “. Mehr dazu...
| Header: | #include <QDataStream> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| Erbt von: | QIODeviceBase |
- Liste aller Mitglieder, einschließlich geerbter Mitglieder
- Veraltete Elemente
- QDataStream ist Teil von „Eingabe/Ausgabe“ und „Netzwerk“.
Hinweis: Alle Funktionen dieser Klasse sind reentrant.
Öffentliche Typen
| enum | ByteOrder { BigEndian, LittleEndian } |
| enum | FloatingPointPrecision { SinglePrecision, DoublePrecision } |
| enum | Status { Ok, ReadPastEnd, ReadCorruptData, WriteFailed, SizeLimitExceeded } |
| enum | Version { Qt_1_0, Qt_2_0, Qt_2_1, Qt_3_0, Qt_3_1, …, Qt_6_12 } |
Öffentliche Funktionen
| QDataStream() | |
| QDataStream(QIODevice *d) | |
| QDataStream(const QByteArray &a) | |
| QDataStream(QByteArray *a, QIODeviceBase::OpenMode mode) | |
| ~QDataStream() | |
| void | abortTransaction() |
| bool | atEnd() const |
| QDataStream::ByteOrder | byteOrder() const |
| bool | commitTransaction() |
| QIODevice * | device() const |
| QDataStream::FloatingPointPrecision | floatingPointPrecision() const |
(since 6.7) QDataStream & | readBytes(char *&s, qint64 &l) |
| qint64 | readRawData(char *s, qint64 len) |
| void | resetStatus() |
| void | rollbackTransaction() |
| void | setByteOrder(QDataStream::ByteOrder bo) |
| void | setDevice(QIODevice *d) |
| void | setFloatingPointPrecision(QDataStream::FloatingPointPrecision precision) |
| void | setStatus(QDataStream::Status status) |
| void | setVersion(int v) |
| qint64 | skipRawData(qint64 len) |
| void | startTransaction() |
| QDataStream::Status | status() const |
| int | version() const |
| QDataStream & | writeBytes(const char *s, qint64 len) |
| qint64 | writeRawData(const char *s, qint64 len) |
(since 6.10) | operator bool() const |
| QDataStream & | operator<<(qint8 i) |
| QDataStream & | operator<<(bool i) |
(since 6.0) QDataStream & | operator<<(char16_t c) |
(since 6.0) QDataStream & | operator<<(char32_t c) |
| QDataStream & | operator<<(const char *s) |
| QDataStream & | operator<<(double f) |
| QDataStream & | operator<<(float f) |
| QDataStream & | operator<<(qint16 i) |
| QDataStream & | operator<<(qint32 i) |
| QDataStream & | operator<<(qint64 i) |
| QDataStream & | operator<<(quint16 i) |
| QDataStream & | operator<<(quint32 i) |
| QDataStream & | operator<<(quint64 i) |
| QDataStream & | operator<<(quint8 i) |
| QDataStream & | operator<<(std::nullptr_t ptr) |
| QDataStream & | operator>>(bool &i) |
| QDataStream & | operator>>(qint8 &i) |
| QDataStream & | operator>>(char *&s) |
(since 6.0) QDataStream & | operator>>(char16_t &c) |
(since 6.0) QDataStream & | operator>>(char32_t &c) |
| QDataStream & | operator>>(double &f) |
| QDataStream & | operator>>(float &f) |
| QDataStream & | operator>>(qint16 &i) |
| QDataStream & | operator>>(qint32 &i) |
| QDataStream & | operator>>(qint64 &i) |
| QDataStream & | operator>>(quint16 &i) |
| QDataStream & | operator>>(quint32 &i) |
| QDataStream & | operator>>(quint64 &i) |
| QDataStream & | operator>>(quint8 &i) |
| QDataStream & | operator>>(std::nullptr_t &ptr) |
Verwandte Nicht-Mitglieder
(since 6.0) QDataStream & | operator<<(QDataStream &out, const std::pair<T1, T2> &pair) |
| QDataStream & | operator<<(QDataStream &ds, qfloat16 f) |
| QDataStream & | operator>>(QDataStream &ds, qfloat16 &f) |
(since 6.0) QDataStream & | operator>>(QDataStream &in, std::pair<T1, T2> &pair) |
Ausführliche Beschreibung
Ein Datenstrom ist ein binärer Strom aus kodierten Informationen, der zu 100 % unabhängig vom Betriebssystem, der CPU oder der Byte-Reihenfolge des Host-Computers ist. So kann beispielsweise ein Datenstrom, der von einem PC unter Windows geschrieben wurde, von einem Sun SPARC mit Solaris gelesen werden.
Sie können einen Datenstrom auch zum Lesen und Schreiben von „ raw unencoded binary data “ verwenden. Wenn Sie einen Eingabestrom zum „Parsen“ benötigen, lesen Sie bitte QTextStream.
Die Klasse `QDataStream` implementiert die Serialisierung der grundlegenden Datentypen von C++, wie z. B. ` char`, ` short`, ` int`, ` char *` usw. Die Serialisierung komplexerer Daten erfolgt durch Aufteilung der Daten in primitive Einheiten.
Ein Datenstrom arbeitet eng mit einem „ QIODevice “ zusammen. Ein „ QIODevice “ stellt ein Ein-/Ausgabemedium dar, aus dem Daten gelesen und in das Daten geschrieben werden können. Die Klasse „ QFile “ ist ein Beispiel für ein E/A-Gerät.
Beispiel (binäre Daten in einen Stream schreiben):
QFile file("file.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file); // we will serialize the data into the file
out << QString("the answer is"); // serialize a string
out << (qint32)42; // serialize an integerBeispiel (binäre Daten aus einem Stream lesen):
QFile file("file.dat");
file.open(QIODevice::ReadOnly);
QDataStream in(&file); // read the data serialized from the file
QString str;
qint32 a;
in >> str >> a; // extract "the answer is" and 42QBrush QColor QDateTime QFont QPixmap QString QVariant XML-Ph-0000@deepl.internal, XML-Ph-0001@deepl.internal, XML-Ph-0002@deepl.internal, XML-Ph-0003@deepl.internal, XML-Ph-0004@deepl.internal, XML-Ph-0005@deepl.internal, XML-Ph-0006@deepl.internal und viele andere. Eine vollständige Liste aller Qt-Typen, die Datenstromübertragung unterstützen, finden Sie unter „Serialisierung von Qt-Datentypen“.
Bei Ganzzahlen empfiehlt es sich, beim Schreiben stets in einen Qt-Ganzzahltyp zu konvertieren und beim Zurücklesen wieder in denselben Qt-Ganzzahltyp zu konvertieren. Dadurch wird sichergestellt, dass Sie Ganzzahlen in der gewünschten Größe erhalten, und Sie sind vor Compiler- und Plattformunterschieden geschützt.
Aufzählungen können über QDataStream serialisiert werden, ohne dass Streaming-Operatoren manuell definiert werden müssen. Enum-Klassen werden anhand der deklarierten Größe serialisiert.
Das anfängliche E/A-Gerät wird in der Regel im Konstruktor festgelegt, kann jedoch mit ` setDevice()` geändert werden. Wenn Sie das Ende der Daten erreicht haben (oder wenn kein E/A-Gerät festgelegt ist), gibt ` atEnd()` den Wert „true“ zurück.
Serialisierung von Containern und Zeichenketten
Das Serialisierungsformat besteht zunächst aus einem Längenangabe-Bezeichner, gefolgt von l Bytes an Daten. Der Längenangabe-Bezeichner ist ein „quint32“, wenn die Version kleiner als 6.7 ist oder wenn die Anzahl der Elemente kleiner als 0xfffffffe (2^32 - 2) ist. Andernfalls folgt auf den Erweiterungswert 0xfffffffe ein „quint64“ mit dem tatsächlichen Wert. Bei Containern, die isNull() unterstützen, wird dieser Wert zudem als einzelnes „quint32“ kodiert, bei dem alle Bits gesetzt sind und keine Daten enthalten sind.
Um ein Beispiel zu nennen: Wenn die Zeichenfolgenlänge in 32 Bit passt, wird eine „ char * “-Zeichenfolge als 32-Bit-Ganzzahl geschrieben, die der Länge der Zeichenfolge entspricht, einschließlich des Bytes „\0 “, gefolgt von allen Zeichen der Zeichenfolge, einschließlich des Bytes „\0 “. Ist die Zeichenfolgenlänge größer, wird der Wert 0xffffffffe als Marker für eine erweiterte Länge geschrieben, gefolgt von 64 Bits der tatsächlichen Länge. Beim Lesen einer „ char * “-Zeichenkette werden zunächst 4 Bytes gelesen. Ist der Wert nicht gleich 0xffffffffe (das Kennzeichen für eine erweiterte Länge), werden diese 4 Bytes als die 32-Bit-Länge der Zeichenkette behandelt. Andernfalls werden die nächsten 8 Bytes gelesen und als 64-Bit-Größe der Zeichenkette behandelt. Anschließend werden alle Zeichen der Zeichenkette „ char * “, einschließlich des Abschlusszeichens „'\0 “, gelesen.
Versionierung
Das Binärformat von QDataStream hat sich seit Qt 1.0 weiterentwickelt und wird sich wahrscheinlich auch weiterhin weiterentwickeln, um Änderungen in Qt Rechnung zu tragen. Bei der Ein- oder Ausgabe komplexer Typen ist es sehr wichtig, sicherzustellen, dass für das Lesen und Schreiben dieselbe Version des Streams (version()) verwendet wird. Wenn Sie sowohl Vorwärts- als auch Rückwärtskompatibilität benötigen, können Sie die Versionsnummer in der Anwendung fest einprogrammieren:
stream.setVersion(QDataStream::Qt_4_0);Wenn Sie ein neues binäres Datenformat erstellen, beispielsweise ein Dateiformat für Dokumente, die von Ihrer Anwendung erzeugt werden, könnten Sie einen QDataStream verwenden, um die Daten in einem portablen Format zu schreiben. In der Regel würden Sie einen kurzen Header schreiben, der eine Magic-String und eine Versionsnummer enthält, um sich Spielraum für zukünftige Erweiterungen zu verschaffen. Zum Beispiel:
QFile file("file.xxx");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
// Write a header with a "magic number" and a version
out << (quint32)0xA0B0C0D0;
out << (qint32)123;
out.setVersion(QDataStream::Qt_4_0);
// Write the data
out << lots_of_interesting_data;Anschließend lesen Sie die Daten mit folgendem Befehl ein:
QFile file("file.xxx");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);
// Read and check the header
quint32 magic;
in >> magic;
if (magic != 0xA0B0C0D0)
return XXX_BAD_FILE_FORMAT;
// Read the version
qint32 version;
in >> version;
if (version < 100)
return XXX_BAD_FILE_TOO_OLD;
if (version > 123)
return XXX_BAD_FILE_TOO_NEW;
if (version <= 110)
in.setVersion(QDataStream::Qt_3_1);
else
in.setVersion(QDataStream::Qt_4_0);
// Read the data
in >> lots_of_interesting_data;
if (version >= 120)
in >> data_new_in_XXX_version_1_2;
in >> other_interesting_data;Sie können auswählen, welche Byte-Reihenfolge bei der Serialisierung von Daten verwendet werden soll. Die Standardeinstellung ist „Big-Endian“ (MSB zuerst). Eine Umstellung auf „Little-Endian“ beeinträchtigt die Portabilität (es sei denn, der Leser wechselt ebenfalls zu „Little-Endian“). Wir empfehlen, diese Einstellung beizubehalten, sofern Sie keine besonderen Anforderungen haben.
Lesen und Schreiben von rohen Binärdaten
Möglicherweise möchten Sie Ihre eigenen rohen Binärdaten direkt in den Datenstrom einlesen bzw. aus diesem schreiben. Daten können mit ` readRawData()` aus dem Datenstrom in einen vorab zugewiesenen ` char * ` gelesen werden. Ebenso können Daten mit ` writeRawData()` in den Datenstrom geschrieben werden. Beachten Sie, dass die Kodierung und Dekodierung der Daten von Ihnen selbst vorgenommen werden muss.
Ein ähnliches Funktionspaar bilden readBytes() und writeBytes(). Diese unterscheiden sich von ihren „Raw“-Entsprechungen wie folgt: readBytes() liest einen „quint32“-Wert ein, der als Länge der zu lesenden Daten angesehen wird; anschließend wird diese Anzahl an Bytes in das vorab zugewiesene „ char * “ gelesen; writeBytes() schreibt einen „quint32“-Wert, der die Länge der Daten enthält, gefolgt von den Daten selbst. Beachten Sie, dass jegliche Kodierung/Dekodierung der Daten (abgesehen vom Längen-`quint32`) von Ihnen selbst vorgenommen werden muss.
Lesen und Schreiben von Qt-Sammelklassen
Die Qt-Containerklassen können ebenfalls in einen `QDataStream` serialisiert werden. Dazu gehören ` QList`, ` QSet`, ` QHash` und ` QMap`. Die Stream-Operatoren sind als Nicht-Mitglieder der Klassen deklariert.
Lesen und Schreiben anderer Qt-Klassen
Zusätzlich zu den hier dokumentierten überladenen Stream-Operatoren verfügen alle Qt-Klassen, die Sie möglicherweise in einen QDataStream serialisieren möchten, über entsprechende Stream-Operatoren, die als Nicht-Mitglieder der Klasse deklariert sind:
QDataStream &operator<<(QDataStream &, const QXxx &);
QDataStream &operator>>(QDataStream &, QXxx &);Hier sind beispielsweise die Stream-Operatoren aufgeführt, die als Nicht-Mitglieder der Klasse „ QImage “ deklariert sind:
QDataStream &operator<<(QDataStream &stream, const QImage &image);
QDataStream &operator>>(QDataStream &stream, QImage &image);Um zu sehen, ob für Ihre bevorzugte Qt-Klasse ähnliche Stream-Operatoren definiert sind, sehen Sie im Abschnitt „Verwandte Nicht-Mitglieder“ auf der Dokumentationsseite der Klasse nach.
Verwendung von Lese-Transaktionen
Wenn ein Datenstrom auf einem asynchronen Gerät verarbeitet wird, können die Datenblöcke zu beliebigen Zeitpunkten eintreffen. Die Klasse `QDataStream` implementiert einen Transaktionsmechanismus, der es ermöglicht, die Daten atomar mit einer Reihe von Stream-Operatoren zu lesen. Als Beispiel können Sie unvollständige Lesevorgänge von einem Socket verarbeiten, indem Sie eine Transaktion in einem Slot verwenden, der mit dem Signal `readyRead()` verbunden ist:
in.startTransaction();
QString str;
qint32 a;
in >> str >> a; // try to read packet atomically
if (!in.commitTransaction())
return; // wait for more dataWird kein vollständiges Paket empfangen, setzt dieser Code den Datenstrom auf die Ausgangsposition zurück; anschließend muss auf den Eintreffen weiterer Daten gewartet werden.
Datenbeschädigung und Sicherheit
QDataStream ist nicht widerstandsfähig gegenüber beschädigten Dateneingaben und sollte daher nicht in sicherheitskritischen Situationen verwendet werden, selbst bei Einsatz von Transaktionen. Transaktionen helfen zwar dabei festzustellen, ob eine gültige Eingabe mit den aktuell auf einem asynchronen Gerät verfügbaren Daten dekodiert werden kann, gehen jedoch davon aus, dass die verfügbaren Daten korrekt formatiert sind.
Zudem reservieren viele QDataStream-Demarshalling-Operatoren Speicherplatz auf der Grundlage von Informationen, die im Datenstrom enthalten sind. Diese Operatoren prüfen nicht, ob die angeforderte Speichermenge angemessen ist oder ob sie mit der im Datenstrom verfügbaren Datenmenge vereinbar ist (Beispiel: Beim Demarshalling eines „ QByteArray “ oder „ QString “ kann die Anforderung zur Zuweisung von mehreren Gigabyte an Daten auftreten).
QDataStream sollte nicht für Inhalte verwendet werden, deren Herkunft nicht vertrauenswürdig ist. Anwendungen sollten so konzipiert sein, dass sie versuchen, nur Streams zu dekodieren, deren Herkunft mindestens ebenso vertrauenswürdig ist wie die der Anwendung selbst oder ihrer Plugins.
Siehe auch QTextStream und QVariant.
Dokumentation zu Mitgliedstypen
enum QDataStream::ByteOrder
Die beim Lesen und Schreiben der Daten verwendete Byte-Reihenfolge.
| Konstante | Wert | Beschreibung |
|---|---|---|
QDataStream::BigEndian | QSysInfo::BigEndian | Das höchstwertige Byte zuerst (Standard) |
QDataStream::LittleEndian | QSysInfo::LittleEndian | Niedrigstwertiges Byte zuerst |
enum QDataStream::FloatingPointPrecision
Die Genauigkeit der Gleitkommazahlen, die zum Lesen und Schreiben der Daten verwendet werden. Dies hat nur Auswirkungen, wenn die Version des Datenstroms „ Qt_4_6 “ oder höher ist.
Warnung: Die Gleitkommagenauigkeit muss sowohl bei dem Objekt, das den Datenstrom schreibt, als auch bei dem Objekt, das ihn liest, auf denselben Wert eingestellt sein.
| Konstante | Wert | Beschreibung |
|---|---|---|
QDataStream::SinglePrecision | 0 | Alle Gleitkommazahlen im Datenstrom haben eine 32-Bit-Genauigkeit. |
QDataStream::DoublePrecision | 1 | Alle Gleitkommazahlen im Datenstrom haben eine 64-Bit-Genauigkeit. |
Siehe auch setFloatingPointPrecision() und floatingPointPrecision().
enum QDataStream::Status
Diese Enumeration beschreibt den aktuellen Status des Datenstroms.
| Konstante | Wert | Beschreibung |
|---|---|---|
QDataStream::Ok | 0 | Der Datenstrom läuft normal. |
QDataStream::ReadPastEnd | 1 | Der Datenstrom hat über das Ende der Daten im zugrunde liegenden Gerät hinaus gelesen. |
QDataStream::ReadCorruptData | 2 | Der Datenstrom hat beschädigte Daten gelesen. |
QDataStream::WriteFailed | 3 | Der Datenstrom kann nicht auf das zugrunde liegende Gerät schreiben. |
QDataStream::SizeLimitExceeded (since Qt 6.7) | 4 | Der Datenstrom kann die Daten weder lesen noch schreiben, da deren Größe die von der aktuellen Plattform unterstützte Obergrenze überschreitet. Dies kann beispielsweise passieren, wenn versucht wird, mehr als 2 GiB Daten auf einer 32-Bit-Plattform zu lesen. |
enum QDataStream::Version
Diese Enumeration enthält symbolische Synonyme für die Versionsnummern des Datenserialisierungsformats.
| Konstante | Wert |
|---|---|
QDataStream::Qt_1_0 | 1 |
QDataStream::Qt_2_0 | 2 |
QDataStream::Qt_2_1 | 3 |
QDataStream::Qt_3_0 | 4 |
QDataStream::Qt_3_1 | 5 |
QDataStream::Qt_3_3 | 6 |
QDataStream::Qt_4_0 | 7 |
QDataStream::Qt_4_1 | Qt_4_0 |
QDataStream::Qt_4_2 | 8 |
QDataStream::Qt_4_3 | 9 |
QDataStream::Qt_4_4 | 10 |
QDataStream::Qt_4_5 | 11 |
QDataStream::Qt_4_6 | 12 |
QDataStream::Qt_4_7 | Qt_4_6 |
QDataStream::Qt_4_8 | Qt_4_7 |
QDataStream::Qt_4_9 | Qt_4_8 |
QDataStream::Qt_5_0 | 13 |
QDataStream::Qt_5_1 | 14 |
QDataStream::Qt_5_2 | 15 |
QDataStream::Qt_5_3 | Qt_5_2 |
QDataStream::Qt_5_4 | 16 |
QDataStream::Qt_5_5 | Qt_5_4 |
QDataStream::Qt_5_6 | 17 |
QDataStream::Qt_5_7 | Qt_5_6 |
QDataStream::Qt_5_8 | Qt_5_7 |
QDataStream::Qt_5_9 | Qt_5_8 |
QDataStream::Qt_5_10 | Qt_5_9 |
QDataStream::Qt_5_11 | Qt_5_10 |
QDataStream::Qt_5_12 | 18 |
QDataStream::Qt_5_13 | 19 |
QDataStream::Qt_5_14 | Qt_5_13 |
QDataStream::Qt_5_15 | Qt_5_14 |
QDataStream::Qt_6_0 | 20 |
QDataStream::Qt_6_1 | Qt_6_0 |
QDataStream::Qt_6_2 | Qt_6_0 |
QDataStream::Qt_6_3 | Qt_6_0 |
QDataStream::Qt_6_4 | Qt_6_0 |
QDataStream::Qt_6_5 | Qt_6_0 |
QDataStream::Qt_6_6 | 21 |
QDataStream::Qt_6_7 | 22 |
QDataStream::Qt_6_8 | Qt_6_7 |
QDataStream::Qt_6_9 | Qt_6_7 |
QDataStream::Qt_6_10 | 23 |
QDataStream::Qt_6_11 | 24 |
QDataStream::Qt_6_12 | Qt_6_11 |
Siehe auch setVersion() und version().
Dokumentation zu den Mitgliedsfunktionen
QDataStream::QDataStream()
Erstellt einen Datenstrom ohne E/A-Gerät.
Siehe auch ` setDevice()`.
[explicit] QDataStream::QDataStream(QIODevice *d)
Erstellt einen Datenstrom, der das E/A-Gerät „ d “ verwendet.
Siehe auch setDevice() und device().
QDataStream::QDataStream(const QByteArray &a)
Erstellt einen schreibgeschützten Datenstrom, der mit dem Byte-Array ` a` arbeitet. Verwenden Sie `QDataStream(QByteArray*, int)`, wenn Sie in ein Byte-Array schreiben möchten.
Da QByteArray keine Unterklasse von QIODevice ist, wird intern ein ` QBuffer ` erstellt, um das Byte-Array zu verpacken.
QDataStream::QDataStream(QByteArray *a, QIODeviceBase::OpenMode mode)
Erstellt einen Datenstrom, der auf ein Byte-Array angewendet wird: ` a`. Die Funktion ` mode ` beschreibt, wie das Gerät verwendet werden soll.
Alternativ können Sie `QDataStream(const QByteArray &)` verwenden, wenn Sie lediglich aus einem Byte-Array lesen möchten.
Da ` QByteArray ` keine Unterklasse von ` QIODevice ` ist, wird intern ein ` QBuffer ` erstellt, um das Byte-Array zu verpacken.
[noexcept] QDataStream::~QDataStream()
Löscht den Datenstrom.
Der Destruktor hat keine Auswirkungen auf das aktuelle E/A-Gerät, es sei denn, es handelt sich um ein internes E/A-Gerät (z. B. ein „ QBuffer “), das einen im Konstruktor übergebenen „ QByteArray “ verarbeitet; in diesem Fall wird das interne E/A-Gerät zerstört.
void QDataStream::abortTransaction()
Bricht eine Lesetransaktion ab.
Diese Funktion wird üblicherweise verwendet, um die Transaktion nach Protokollfehlern auf höherer Ebene oder nach Verlust der Stream-Synchronisation abzubrechen.
Wird die Funktion bei einer inneren Transaktion aufgerufen, wird der Abbruch an die äußerste Transaktion delegiert, und anschließend gestartete innere Transaktionen werden zwangsweise zum Fehlschlagen gebracht.
Bei der äußersten Transaktion werden der Wiederherstellungspunkt und alle intern duplizierten Daten des Datenstroms verworfen. Die aktuelle Lese-Position des Datenstroms wird dadurch nicht beeinflusst.
Setzt den Status des Datenstroms auf
| Konstant | Beschreibung |
|---|---|
ReadCorruptData | . |
Siehe auch startTransaction(), commitTransaction() und rollbackTransaction().
bool QDataStream::atEnd() const
Gibt „ true “ zurück, wenn das E/A-Gerät die Endposition (Ende des Datenstroms oder der Datei) erreicht hat oder wenn kein E/A-Gerät festgelegt ist; andernfalls wird „ false “ zurückgegeben.
Siehe auch QIODevice::atEnd().
QDataStream::ByteOrder QDataStream::byteOrder() const
Gibt die aktuelle Byte-Reihenfolge-Einstellung zurück – entweder „ BigEndian “ oder „ LittleEndian “.
Siehe auch setByteOrder().
bool QDataStream::commitTransaction()
Schließt eine Lesetransaktion ab. Gibt „ true “ zurück, wenn während der Transaktion keine Lesefehler aufgetreten sind; andernfalls wird „ false “ zurückgegeben.
Wird diese Funktion innerhalb einer inneren Transaktion aufgerufen, wird die Festschreibung so lange aufgeschoben, bis der äußerste Aufruf von `commitTransaction()`, ` rollbackTransaction()` oder ` abortTransaction()` erfolgt.
Andernfalls, wenn der Stream-Status anzeigt, dass über das Ende der Daten hinaus gelesen wurde, setzt diese Funktion die Stream-Daten auf den Zeitpunkt des Aufrufs von ` startTransaction()` zurück. Tritt diese Situation ein, müssen Sie warten, bis weitere Daten eintreffen; anschließend starten Sie eine neue Transaktion. Wenn der Datenstrom beschädigte Daten gelesen hat oder eine der inneren Transaktionen abgebrochen wurde, bricht diese Funktion die Transaktion ab.
Siehe auch ` startTransaction()`, ` rollbackTransaction()` und ` abortTransaction()`.
QIODevice *QDataStream::device() const
Gibt das aktuell eingestellte E/A-Gerät zurück oder „ nullptr “, falls derzeit kein Gerät eingestellt ist.
Siehe auch setDevice().
QDataStream::FloatingPointPrecision QDataStream::floatingPointPrecision() const
Gibt die Gleitkommagenauigkeit des Datenstroms zurück.
Siehe auch „ FloatingPointPrecision “ und „ setFloatingPointPrecision()“.
[since 6.7] QDataStream &QDataStream::readBytes(char *&s, qint64 &l)
Liest den Puffer „ s “ aus dem Stream und gibt eine Referenz auf den Stream zurück.
Der Puffer „ s “ wird mit „ new [] “ zugewiesen. Löschen Sie ihn mit dem Operator „ delete [] “.
Der Parameter ` l ` wird auf die Länge des Puffers gesetzt. Ist die gelesene Zeichenkette leer, wird ` l ` auf 0 und ` s ` auf ` nullptr` gesetzt.
Das Serialisierungsformat besteht zunächst aus einem Längenangabe-Spekifikator, gefolgt von l Bytes an Daten. Der Längenbezeichner ist ein „quint32“, wenn die Version kleiner als 6.7 ist oder wenn die Anzahl der Elemente kleiner als 0xfffffffe (2^32 - 2) ist; andernfalls gibt es einen Erweiterungswert 0xfffffffe, gefolgt von einem „quint64“ mit dem tatsächlichen Wert. Bei Containern, die isNull() unterstützen, wird dieser Wert zudem als einzelnes „quint32“ mit gesetzten Bits und ohne Daten kodiert.
Diese Funktion wurde in Qt 6.7 eingeführt.
Siehe auch readRawData() und writeBytes().
qint64 QDataStream::readRawData(char *s, qint64 len)
Liest höchstens len Bytes aus dem Stream in s und gibt die Anzahl der gelesenen Bytes zurück. Tritt ein Fehler auf, gibt diese Funktion -1 zurück.
Der Puffer ` s ` muss vorab reserviert sein. Die Daten werden nicht dekodiert.
Siehe auch readBytes(), QIODevice::read() und writeRawData().
void QDataStream::resetStatus()
Setzt den Status des Datenstroms zurück.
Siehe auch „ Status“ , „ status()“ und „ setStatus()“.
void QDataStream::rollbackTransaction()
Macht eine Lesetransaktion rückgängig.
Diese Funktion wird üblicherweise verwendet, um die Transaktion zurückzusetzen, wenn vor dem Commit der Transaktion ein unvollständiger Lesevorgang festgestellt wurde.
Wird die Funktion in einer inneren Transaktion aufgerufen, wird das Zurücksetzen an die äußerste Transaktion delegiert, und anschließend gestartete innere Transaktionen werden zwangsweise abgebrochen.
Für die äußerste Transaktion werden die Stream-Daten auf den Zeitpunkt des Aufrufs von ` startTransaction()` zurückgesetzt. Wenn der Datenstrom beschädigte Daten gelesen hat oder eine der inneren Transaktionen abgebrochen wurde, bricht diese Funktion die Transaktion ab.
Waren die vorangegangenen Stream-Operationen erfolgreich, wird der Status des Datenstroms auf
| Constant | Beschreibung |
|---|---|
ReadPastEnd | . |
Siehe auch „ startTransaction()“, „ commitTransaction()“ und „ abortTransaction()“.
void QDataStream::setByteOrder(QDataStream::ByteOrder bo)
Legt die Byte-Reihenfolge bei der Serialisierung auf „ bo “ fest.
Der Parameter „ bo “ kann folgende Werte annehmen: „ QDataStream::BigEndian “ oder „ QDataStream::LittleEndian “.
Die Standardeinstellung ist „big-endian“. Wir empfehlen, diese Einstellung beizubehalten, sofern Sie keine besonderen Anforderungen haben.
Siehe auch byteOrder().
void QDataStream::setDevice(QIODevice *d)
void QDataStream::setDevice(QIODevice * d)
Setzt das E/A-Gerät auf ` d`. Mit ` nullptr ` kann die Zuordnung zum aktuellen E/A-Gerät aufgehoben werden.
Siehe auch device().
void QDataStream::setFloatingPointPrecision(QDataStream::FloatingPointPrecision precision)
Legt die Gleitkommagenauigkeit des Datenstroms auf „ precision “ fest. Wenn die Gleitkommagenauigkeit „ DoublePrecision “ lautet und die Version des Datenstroms „ Qt_4_6 “ oder höher ist, werden alle Gleitkommazahlen mit 64-Bit-Genauigkeit geschrieben und gelesen. Wenn die Gleitkommagenauigkeit „ SinglePrecision “ beträgt und die Version „ Qt_4_6 “ oder höher ist, werden alle Gleitkommazahlen mit 32-Bit-Genauigkeit geschrieben und gelesen.
Bei Versionen vor Qt_4_6 hängt die Genauigkeit der Gleitkommazahlen im Datenstrom vom aufgerufenen Stream-Operator ab.
Die Standardeinstellung ist „ DoublePrecision “.
Beachten Sie, dass diese Eigenschaft keinen Einfluss auf die Serialisierung oder Deserialisierung von „ qfloat16 “-Instanzen hat.
Warnung: Diese Eigenschaft muss sowohl für das Objekt, das den Datenstrom schreibt, als auch für das Objekt, das ihn liest, auf denselben Wert gesetzt werden.
Siehe auch ` floatingPointPrecision()`.
void QDataStream::setStatus(QDataStream::Status status)
Setzt den Status des Datenstroms auf den angegebenen „ status “.
Nachfolgende Aufrufe von `setStatus()` werden ignoriert, bis ` resetStatus()` aufgerufen wird.
Siehe auch „ Status“ , „ status()“ und „ resetStatus()“.
void QDataStream::setVersion(int v)
Setzt die Versionsnummer des Datenserialisierungsformats auf „ v “, einen Wert aus der Enumeration „ Version “.
Sie müssen keine Version festlegen, wenn Sie die aktuelle Version von Qt verwenden, aber für Ihre eigenen benutzerdefinierten Binärformate empfehlen wir dies; siehe „ Versioning “ in der detaillierten Beschreibung.
Um neuen Funktionen Rechnung zu tragen, hat sich das Datenstrom-Serialisierungsformat einiger Qt-Klassen in bestimmten Qt-Versionen geändert. Wenn du Daten lesen möchtest, die mit einer früheren Qt-Version erstellt wurden, oder Daten schreiben möchtest, die von einem Programm gelesen werden können, das mit einer früheren Qt-Version kompiliert wurde, verwende diese Funktion, um das von ` QDataStream` verwendete Serialisierungsformat anzupassen.
Die Enumeration ` Version ` stellt symbolische Konstanten für die verschiedenen Qt-Versionen bereit. Zum Beispiel:
QDataStream out(&file);
out.setVersion(QDataStream::Qt_4_0);Siehe auch ` version()` und ` Version`.
qint64 QDataStream::skipRawData(qint64 len)
Überspringt len Bytes vom Gerät. Gibt die Anzahl der tatsächlich übersprungenen Bytes zurück oder -1 im Fehlerfall.
Dies entspricht dem Aufruf von ` readRawData()` für einen Puffer der Länge ` len ` und dem Ignorieren des Puffers.
Siehe auch ` QIODevice::seek()`.
void QDataStream::startTransaction()
Startet eine neue Lese-Transaktion im Stream.
Definiert einen wiederherstellbaren Punkt innerhalb der Abfolge von Lesevorgängen. Bei sequenziellen Geräten werden die Lesedaten intern dupliziert, um im Falle unvollständiger Lesevorgänge eine Wiederherstellung zu ermöglichen. Bei Geräten mit wahlfreiem Zugriff speichert diese Funktion die aktuelle Position des Streams. Rufen Sie „ commitTransaction()“, „ rollbackTransaction()“ oder „ abortTransaction()“ auf, um die aktuelle Transaktion zu beenden.
Sobald eine Transaktion gestartet wurde, führen nachfolgende Aufrufe dieser Funktion dazu, dass die Transaktion rekursiv wird. Innere Transaktionen agieren als Vertreter der äußersten Transaktion (d. h., sie melden den Status von Lesevorgängen an die äußerste Transaktion, die die Position des Datenstroms wiederherstellen kann).
Hinweis: Eine Wiederherstellung bis zum Zeitpunkt des verschachtelten Aufrufs von `startTransaction()` wird nicht unterstützt.
Tritt während einer Transaktion ein Fehler auf (einschließlich des Fehlschlags einer inneren Transaktion), wird das Lesen aus dem Datenstrom unterbrochen (alle nachfolgenden Lesevorgänge geben leere/Null-Werte zurück) und nachfolgende innere Transaktionen werden zwangsweise zum Fehlschlagen gebracht. Das Starten einer neuen äußersten Transaktion stellt diesen Zustand wieder her. Durch dieses Verhalten ist es nicht erforderlich, jeden Lesevorgang separat auf Fehler zu prüfen.
Siehe auch commitTransaction(), rollbackTransaction() und abortTransaction().
QDataStream::Status QDataStream::status() const
Gibt den Status des Datenstroms zurück.
Siehe auch „ Status“ , „ setStatus()“ und „ resetStatus()“.
int QDataStream::version() const
Gibt die Versionsnummer des Datenserialisierungsformats zurück.
Siehe auch setVersion() und Version.
QDataStream &QDataStream::writeBytes(const char *s, qint64 len)
Schreibt den Längenbezeichner len und den Puffer s in den Stream und gibt eine Referenz auf den Stream zurück.
Der Wert „ len “ wird als „quint32“ und optional als „quint64“ serialisiert, gefolgt von „ len “ Bytes aus „ s “. Beachten Sie, dass die Daten nicht kodiert werden.
Siehe auch „ writeRawData()“ und „ readBytes()“.
qint64 QDataStream::writeRawData(const char *s, qint64 len)
Schreibt len Bytes von s in den Stream. Gibt die Anzahl der tatsächlich geschriebenen Bytes zurück oder -1 im Fehlerfall. Die Daten werden nicht kodiert.
Siehe auch writeBytes(), QIODevice::write() und readRawData().
[explicit noexcept, since 6.10] QDataStream::operator bool() const
Gibt zurück, ob dieser Stream fehlerfrei ist (status() gibt „ Ok “ zurück).
Diese Funktion wurde in Qt 6.10 eingeführt.
QDataStream &QDataStream::operator<<(qint8 i)
Schreibt ein vorzeichenbehaftetes Byte ( i) in den Stream und gibt eine Referenz auf den Stream zurück.
QDataStream &QDataStream::operator<<(bool i)
Schreibt einen booleschen Wert ( i) in den Stream. Gibt eine Referenz auf den Stream zurück.
Dies ist eine überladene Funktion.
[since 6.0] QDataStream &QDataStream::operator<<(char16_t c)
Schreibt ein Zeichen ( c) in den Stream. Gibt eine Referenz auf den Stream zurück
Dies ist eine überladene Funktion.
Diese Funktion wurde in Qt 6.0 eingeführt.
[since 6.0] QDataStream &QDataStream::operator<<(char32_t c)
Schreibt ein Zeichen ( c) in den Stream. Gibt eine Referenz auf den Stream zurück
Dies ist eine überladene Funktion.
Diese Funktion wurde in Qt 6.0 eingeführt.
QDataStream &QDataStream::operator<<(const char *s)
Schreibt die durch „\0 “ begrenzte Zeichenkette „ s “ in den Stream und gibt eine Referenz auf den Stream zurück.
Die Zeichenkette wird mithilfe von ` writeBytes()` serialisiert.
Dies ist eine überladene Funktion.
Siehe auch writeBytes() und writeRawData().
QDataStream &QDataStream::operator<<(double f)
Schreibt eine Gleitkommazahl, f, im Standardformat IEEE 754 in den Stream. Gibt eine Referenz auf den Stream zurück.
Dies ist eine überladene Funktion.
Siehe auch ` setFloatingPointPrecision()`.
QDataStream &QDataStream::operator<<(float f)
Schreibt eine Gleitkommazahl, f, im Standardformat IEEE 754 in den Stream. Gibt eine Referenz auf den Stream zurück.
Dies ist eine überladene Funktion.
Siehe auch ` setFloatingPointPrecision()`.
QDataStream &QDataStream::operator<<(qint16 i)
Schreibt eine vorzeichenbehaftete 16-Bit-Ganzzahl, i, in den Stream und gibt eine Referenz auf den Stream zurück.
Dies ist eine überladene Funktion.
QDataStream &QDataStream::operator<<(qint32 i)
Schreibt eine vorzeichenbehaftete 32-Bit-Ganzzahl ( i) in den Stream und gibt eine Referenz auf den Stream zurück.
Dies ist eine überladene Funktion.
QDataStream &QDataStream::operator<<(qint64 i)
Schreibt eine vorzeichenbehaftete 64-Bit-Ganzzahl ( i) in den Stream und gibt eine Referenz auf den Stream zurück.
Dies ist eine überladene Funktion.
QDataStream &QDataStream::operator<<(quint16 i)
Schreibt eine vorzeichenlose 16-Bit-Ganzzahl, i, in den Stream und gibt einen Verweis auf den Stream zurück.
Dies ist eine überladene Funktion.
QDataStream &QDataStream::operator<<(quint32 i)
Schreibt eine vorzeichenlose Ganzzahl, i, als 32-Bit-Ganzzahl ohne Vorzeichen (quint32) in den Stream. Gibt eine Referenz auf den Stream zurück.
Dies ist eine überladene Funktion.
QDataStream &QDataStream::operator<<(quint64 i)
Schreibt eine vorzeichenlose 64-Bit-Ganzzahl, i, in den Stream und gibt eine Referenz auf den Stream zurück.
Dies ist eine überladene Funktion.
QDataStream &QDataStream::operator<<(quint8 i)
Schreibt ein vorzeichenloses Byte ( i) in den Stream und gibt eine Referenz auf den Stream zurück.
Dies ist eine überladene Funktion.
QDataStream &QDataStream::operator<<(std::nullptr_t ptr)
Simuliert das Schreiben eines std::nullptr_t( ptr) in den Stream und gibt eine Referenz auf den Stream zurück. Diese Funktion schreibt tatsächlich nichts in den Stream, da std::nullptr_t -Werte als 0 Byte gespeichert werden.
Dies ist eine überladene Funktion.
QDataStream &QDataStream::operator>>(bool &i)
Liest einen booleschen Wert aus dem Stream in ` i` ein. Gibt eine Referenz auf den Stream zurück.
QDataStream &QDataStream::operator>>(qint8 &i)
Liest ein vorzeichenbehaftetes Byte aus dem Stream in ` i` ein und gibt eine Referenz auf den Stream zurück.
QDataStream &QDataStream::operator>>(char *&s)
Liest die Zeichenkette s aus dem Stream und gibt eine Referenz auf den Stream zurück.
Die Zeichenkette wird mit readBytes() deserialisiert, wobei das Serialisierungsformat zunächst aus einem Längenangabe- quint32 besteht, gefolgt von entsprechend vielen Datenbytes. Die resultierende Zeichenkette endet immer mit „\0 “.
Der Speicherplatz für die Zeichenkette wird mit ` new [] ` zugewiesen – der Aufrufer muss ihn mit ` delete []` freigeben.
Dies ist eine überladene Funktion.
Siehe auch readBytes() und readRawData().
[since 6.0] QDataStream &QDataStream::operator>>(char16_t &c)
Liest ein 16-Bit-Zeichen aus dem Stream in ` c ` ein und gibt eine Referenz auf den Stream zurück.
Dies ist eine überladene Funktion.
Diese Funktion wurde in Qt 6.0 eingeführt.
[since 6.0] QDataStream &QDataStream::operator>>(char32_t &c)
Liest ein 32-Bit-Zeichen aus dem Stream in ` c ` ein und gibt eine Referenz auf den Stream zurück.
Dies ist eine überladene Funktion.
Diese Funktion wurde in Qt 6.0 eingeführt.
QDataStream &QDataStream::operator>>(double &f)
Liest eine Gleitkommazahl aus dem Stream in ` f` unter Verwendung des Standardformats IEEE 754 ein. Gibt eine Referenz auf den Stream zurück.
Dies ist eine überladene Funktion.
Siehe auch ` setFloatingPointPrecision()`.
QDataStream &QDataStream::operator>>(float &f)
Liest eine Gleitkommazahl aus dem Stream in ` f` unter Verwendung des Standardformats IEEE 754 ein. Gibt eine Referenz auf den Stream zurück.
Dies ist eine überladene Funktion.
Siehe auch ` setFloatingPointPrecision()`.
QDataStream &QDataStream::operator>>(qint16 &i)
Liest eine vorzeichenbehaftete 16-Bit-Ganzzahl aus dem Stream in ` i` ein und gibt eine Referenz auf den Stream zurück.
Dies ist eine überladene Funktion.
QDataStream &QDataStream::operator>>(qint32 &i)
Liest eine vorzeichenbehaftete 32-Bit-Ganzzahl aus dem Stream in ` i` ein und gibt eine Referenz auf den Stream zurück.
Dies ist eine überladene Funktion.
QDataStream &QDataStream::operator>>(qint64 &i)
Liest eine vorzeichenbehaftete 64-Bit-Ganzzahl aus dem Stream in ` i` ein und gibt eine Referenz auf den Stream zurück.
Dies ist eine überladene Funktion.
QDataStream &QDataStream::operator>>(quint16 &i)
Liest eine vorzeichenlose 16-Bit-Ganzzahl aus dem Stream in ` i` ein und gibt eine Referenz auf den Stream zurück.
Dies ist eine überladene Funktion.
QDataStream &QDataStream::operator>>(quint32 &i)
Liest eine vorzeichenlose 32-Bit-Ganzzahl aus dem Stream in ` i` ein und gibt eine Referenz auf den Stream zurück.
Dies ist eine überladene Funktion.
QDataStream &QDataStream::operator>>(quint64 &i)
Liest eine vorzeichenlose 64-Bit-Ganzzahl aus dem Stream in ` i` ein und gibt eine Referenz auf den Stream zurück.
Dies ist eine überladene Funktion.
QDataStream &QDataStream::operator>>(quint8 &i)
Liest ein vorzeichenloses Byte aus dem Stream in ` i` ein und gibt eine Referenz auf den Stream zurück.
Dies ist eine überladene Funktion.
QDataStream &QDataStream::operator>>(std::nullptr_t &ptr)
Simuliert das Einlesen eines „ std::nullptr_t “ aus dem Stream in „ ptr “ und gibt eine Referenz auf den Stream zurück. Diese Funktion liest tatsächlich nichts aus dem Stream ein, da „ std::nullptr_t “-Werte als 0 Byte gespeichert werden.
Dies ist eine überladene Funktion.
Verwandte Nicht-Mitglieder
[since 6.0] template <typename T1, typename T2> QDataStream &operator<<(QDataStream &out, const std::pair<T1, T2> &pair)
Schreibt das Paar „ pair “ in den Stream „ out “.
Diese Funktion erfordert, dass die Typen T1 und T2 operator<<() implementieren.
Diese Funktion wurde in Qt 6.0 eingeführt.
Siehe auch „Serialisierung vonQt-Datentypen“.
QDataStream &operator<<(QDataStream &ds, qfloat16 f)
Schreibt eine Gleitkommazahl, f, im Standardformat IEEE 754 in den Stream ds. Gibt eine Referenz auf den Stream zurück.
Hinweis: In Qt-Versionen vor 6.3 war dies eine Memberfunktion von ` QDataStream`.
QDataStream &operator>>(QDataStream &ds, qfloat16 &f)
Liest eine Gleitkommazahl aus dem Stream „ ds “ in „ f “ unter Verwendung des Standardformats IEEE 754 ein. Gibt eine Referenz auf den Stream zurück.
Hinweis: In Qt-Versionen vor 6.3 war dies eine Mitgliedsfunktion von ` QDataStream`.
[since 6.0] template <typename T1, typename T2> QDataStream &operator>>(QDataStream &in, std::pair<T1, T2> &pair)
Liest ein Paar aus dem Stream „ in “ in „ pair “ ein.
Diese Funktion setzt voraus, dass die Typen T1 und T2 die Schnittstelle operator>>() implementieren.
Diese Funktion wurde in Qt 6.0 eingeführt.
Siehe auch „Serialisierung vonQt-Datentypen“.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.