Auf dieser Seite

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

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)
(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 integer

Beispiel (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 42

QBrush 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 data

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

KonstanteWertBeschreibung
QDataStream::BigEndianQSysInfo::BigEndianDas höchstwertige Byte zuerst (Standard)
QDataStream::LittleEndianQSysInfo::LittleEndianNiedrigstwertiges 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.

KonstanteWertBeschreibung
QDataStream::SinglePrecision0Alle Gleitkommazahlen im Datenstrom haben eine 32-Bit-Genauigkeit.
QDataStream::DoublePrecision1Alle Gleitkommazahlen im Datenstrom haben eine 64-Bit-Genauigkeit.

Siehe auch setFloatingPointPrecision() und floatingPointPrecision().

enum QDataStream::Status

Diese Enumeration beschreibt den aktuellen Status des Datenstroms.

KonstanteWertBeschreibung
QDataStream::Ok0Der Datenstrom läuft normal.
QDataStream::ReadPastEnd1Der Datenstrom hat über das Ende der Daten im zugrunde liegenden Gerät hinaus gelesen.
QDataStream::ReadCorruptData2Der Datenstrom hat beschädigte Daten gelesen.
QDataStream::WriteFailed3Der Datenstrom kann nicht auf das zugrunde liegende Gerät schreiben.
QDataStream::SizeLimitExceeded (since Qt 6.7)4Der 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.

KonstanteWert
QDataStream::Qt_1_01
QDataStream::Qt_2_02
QDataStream::Qt_2_13
QDataStream::Qt_3_04
QDataStream::Qt_3_15
QDataStream::Qt_3_36
QDataStream::Qt_4_07
QDataStream::Qt_4_1Qt_4_0
QDataStream::Qt_4_28
QDataStream::Qt_4_39
QDataStream::Qt_4_410
QDataStream::Qt_4_511
QDataStream::Qt_4_612
QDataStream::Qt_4_7Qt_4_6
QDataStream::Qt_4_8Qt_4_7
QDataStream::Qt_4_9Qt_4_8
QDataStream::Qt_5_013
QDataStream::Qt_5_114
QDataStream::Qt_5_215
QDataStream::Qt_5_3Qt_5_2
QDataStream::Qt_5_416
QDataStream::Qt_5_5Qt_5_4
QDataStream::Qt_5_617
QDataStream::Qt_5_7Qt_5_6
QDataStream::Qt_5_8Qt_5_7
QDataStream::Qt_5_9Qt_5_8
QDataStream::Qt_5_10Qt_5_9
QDataStream::Qt_5_11Qt_5_10
QDataStream::Qt_5_1218
QDataStream::Qt_5_1319
QDataStream::Qt_5_14Qt_5_13
QDataStream::Qt_5_15Qt_5_14
QDataStream::Qt_6_020
QDataStream::Qt_6_1Qt_6_0
QDataStream::Qt_6_2Qt_6_0
QDataStream::Qt_6_3Qt_6_0
QDataStream::Qt_6_4Qt_6_0
QDataStream::Qt_6_5Qt_6_0
QDataStream::Qt_6_621
QDataStream::Qt_6_722
QDataStream::Qt_6_8Qt_6_7
QDataStream::Qt_6_9Qt_6_7
QDataStream::Qt_6_1023
QDataStream::Qt_6_1124
QDataStream::Qt_6_12Qt_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

KonstantBeschreibung
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

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