QDataStream Class

Die Klasse QDataStream ermöglicht die Serialisierung von Binärdaten in ein QIODevice. Mehr...

Kopfzeile: #include <QDataStream>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Erbt: QIODeviceBase

Hinweis: Alle Funktionen in 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_8 }

Ö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)
(until 6.11) QDataStream &readBytes(char *&s, uint &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)
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)
(since 6.0) QDataStream &operator>>(QDataStream &in, std::pair<T1, T2> &pair)

Detaillierte Beschreibung

Ein Datenstrom ist ein binärer Strom kodierter 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 wird, von einem Sun SPARC mit Solaris gelesen werden.

Sie können einen Datenstrom auch zum Lesen/Schreiben von raw unencoded binary data verwenden. Wenn Sie einen "parsenden" Eingabestrom wünschen, lesen Sie QTextStream.

Die Klasse QDataStream implementiert die Serialisierung der grundlegenden Datentypen von C++, wie 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. QIODevice stellt ein Ein-/Ausgabemedium dar, von dem man Daten lesen und in das man Daten schreiben kann. Die Klasse QFile ist ein Beispiel für ein E/A-Gerät.

Beispiel (Schreiben von Binärdaten in einen Datenstrom):

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 (Lesen von Binärdaten aus einem Stream):

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

Jedes Element, das in den Stream geschrieben wird, wird in einem vordefinierten Binärformat geschrieben, das je nach Typ des Elements variiert. Unterstützte Qt-Typen sind QBrush, QColor, QDateTime, QFont, QPixmap, QString, QVariant und viele andere. Eine vollständige Liste aller Qt-Typen, die Daten-Streaming unterstützen, finden Sie unter Serialisierung von Qt-Datentypen.

Für Ganzzahlen ist es am besten, beim Schreiben immer in einen Qt-Integer-Typ zu casten und in denselben Qt-Integer-Typ zurückzulesen. Dies stellt sicher, dass Sie Ganzzahlen in der gewünschten Größe erhalten und schützt Sie vor Compiler- und Plattformunterschieden.

Aufzählungen können durch QDataStream serialisiert werden, ohne dass manuelle Streaming-Operatoren definiert werden müssen. Enum-Klassen werden unter Verwendung der deklarierten Größe serialisiert.

Das anfängliche E/A-Gerät wird normalerweise im Konstruktor festgelegt, kann aber mit setDevice() geändert werden. Wenn Sie das Ende der Daten erreicht haben (oder wenn kein E/A-Gerät eingestellt ist), gibt atEnd() true zurück.

Serialisierung von Containern und Strings

Das Serialisierungsformat ist zuerst ein Längenbezeichner, dann l Bytes der Daten. Die Längenangabe ist eine 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 aktuellen Wert. Bei Containern, die isNull() unterstützen, wird er zusätzlich als einzelner quint32 mit allen gesetzten Bits und ohne Daten kodiert.

Ein Beispiel: Wenn die Größe der Zeichenkette in 32 Bits passt, wird eine char * Zeichenkette als 32-Bit-Ganzzahl geschrieben, die der Länge der Zeichenkette entspricht, einschließlich des '\0'-Bytes, gefolgt von allen Zeichen der Zeichenkette, einschließlich des '\0'-Bytes. Ist die Größe der Zeichenkette größer, wird der Wert 0xffffffffe als Markierung für eine erweiterte Größe geschrieben, gefolgt von 64 Bit der tatsächlichen Größe. Beim Lesen einer char * Zeichenfolge werden zuerst 4 Bytes gelesen. Ist der Wert ungleich 0xffffffffe (die Markierung der erweiterten Größe), werden diese 4 Bytes als die 32-Bit-Größe des Strings behandelt. Andernfalls werden die nächsten 8 Bytes gelesen und als 64-Bit-Größe des Strings behandelt. Dann werden alle Zeichen der Zeichenfolge 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 zu reflektieren. Bei der Eingabe oder Ausgabe komplexer Typen ist es sehr wichtig, sicherzustellen, dass die gleiche Version des Streams (version()) zum Lesen und Schreiben verwendet wird. Wenn Sie sowohl Vorwärts- als auch Rückwärtskompatibilität benötigen, können Sie die Versionsnummer in der Anwendung hardcodieren:

stream.setVersion(QDataStream::Qt_4_0);

Wenn Sie ein neues binäres Datenformat erzeugen, z. B. ein Dateiformat für von Ihrer Anwendung erstellte Dokumente, können Sie einen QDataStream verwenden, um die Daten in einem portablen Format zu schreiben. Normalerweise würden Sie einen kurzen Header schreiben, der eine magische Zeichenkette und eine Versionsnummer enthält, um sich Raum 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;

Dann lesen Sie es ein mit:

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_2);
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 Bytereihenfolge bei der Serialisierung von Daten verwendet werden soll. Die Standardeinstellung ist Big-Endian (MSB first). Eine Änderung in Little-Endian beeinträchtigt die Portabilität (es sei denn, das Lesegerät stellt ebenfalls auf Little-Endian um). Wir empfehlen, diese Einstellung beizubehalten, es sei denn, Sie haben besondere Anforderungen.

Lesen und Schreiben von Rohbinärdaten

Möglicherweise möchten Sie Ihre eigenen binären Rohdaten direkt in den Datenstrom einlesen oder daraus schreiben. Mit readRawData() können Sie Daten aus dem Datenstrom in ein zuvor zugewiesenes char * lesen. In ähnlicher Weise können Daten mit writeRawData() in den Datenstrom geschrieben werden. Beachten Sie, dass die Kodierung/Dekodierung der Daten von Ihnen selbst vorgenommen werden muss.

Ein ähnliches Paar von Funktionen ist readBytes() und writeBytes(). Diese unterscheiden sich von ihren rohen Gegenstücken wie folgt: readBytes() liest eine quint32, die als die Länge der zu lesenden Daten angenommen wird, dann wird diese Anzahl von Bytes in das vorher zugewiesene char * gelesen; writeBytes() schreibt eine quint32, die die Länge der Daten enthält, gefolgt von den Daten. Beachten Sie, dass jede Kodierung/Dekodierung der Daten (abgesehen von der Länge quint32) von Ihnen vorgenommen werden muss.

Lesen und Schreiben von Qt Collection Klassen

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 haben alle Qt-Klassen, die Sie in einen QDataStream serialisieren möchten, entsprechende Stream-Operatoren, die als Nicht-Mitglieder der Klasse deklariert sind:

QDataStream &operator<<(QDataStream &, const QXxx &);
QDataStream &operator>>(QDataStream &, QXxx &);

Hier sind zum Beispiel die Stream-Operatoren, 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 Ihre bevorzugte Qt-Klasse ähnliche Stream-Operatoren definiert hat, überprüfen Sie den Abschnitt Verwandte Nicht-Mitglieder auf der Dokumentationsseite der Klasse.

Verwendung von Read-Transaktionen

Wenn ein Datenstrom auf einem asynchronen Gerät arbeitet, können die Datenpakete zu beliebigen Zeitpunkten eintreffen. Die Klasse QDataStream implementiert einen Transaktionsmechanismus, der die Möglichkeit bietet, die Daten atomar mit einer Reihe von Stream-Operatoren zu lesen. So können Sie beispielsweise unvollständige Lesevorgänge von einem Socket behandeln, indem Sie eine Transaktion in einem Slot verwenden, der mit dem readyRead()-Signal 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 wieder in die Ausgangsposition zurück, woraufhin Sie auf weitere Daten warten müssen.

Korruption und Sicherheit

QDataStream ist nicht widerstandsfähig gegen beschädigte Dateneingaben und sollte daher nicht für sicherheitsrelevante Situationen verwendet werden, auch nicht bei Verwendung von Transaktionen. Transaktionen helfen dabei festzustellen, ob eine gültige Eingabe mit den aktuell auf einem asynchronen Gerät verfügbaren Daten dekodiert werden kann, gehen aber davon aus, dass die verfügbaren Daten korrekt geformt sind.

Darüber hinaus weisen viele QDataStream Demarshalling-Operatoren Speicher auf der Grundlage der im Stream gefundenen Informationen zu. Diese Operatoren überprüfen nicht, ob die angeforderte Speichermenge angemessen ist oder ob sie mit der im Stream verfügbaren Datenmenge kompatibel ist (Beispiel: Beim Demarshalling eines QByteArray oder QString kann die Zuweisung mehrerer Gigabytes an Daten angefordert werden).

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 so vertrauenswürdig ist wie die der Anwendung selbst oder ihrer Plugins.

Siehe auch QTextStream und QVariant.

Dokumentation der Mitgliedstypen

enum QDataStream::ByteOrder

Die zum Lesen/Schreiben der Daten verwendete Bytereihenfolge.

KonstanteWertBeschreibung
QDataStream::BigEndianQSysInfo::BigEndianHöchstwertiges Byte zuerst (Standard)
QDataStream::LittleEndianQSysInfo::LittleEndianNiedrigstwertiges Byte zuerst

enum QDataStream::FloatingPointPrecision

Die Genauigkeit der Gleitkommazahlen, die zum Lesen/Schreiben der Daten verwendet werden. Dies hat nur Auswirkungen, wenn die Version des Datenstroms Qt_4_6 oder höher ist.

Achtung! Die Fließkomma-Präzision muss bei dem Objekt, das den Datenstrom schreibt, und dem Objekt, das ihn liest, auf denselben Wert eingestellt sein.

KonstanteWertBeschreibung
QDataStream::SinglePrecision0Alle Fließkommazahlen im Datenstrom haben eine 32-Bit-Präzision.
QDataStream::DoublePrecision1Alle Fließkommazahlen im Datenstrom haben eine 64-Bit-Präzision.

Siehe auch setFloatingPointPrecision() und floatingPointPrecision().

enum QDataStream::Status

Diese Aufzählung beschreibt den aktuellen Status des Datenstroms.

KonstanteWertBeschreibung
QDataStream::Ok0Der Datenstrom arbeitet normal.
QDataStream::ReadPastEnd1Der Datenstrom hat das Ende der Daten im zugrunde liegenden Gerät überlesen.
QDataStream::ReadCorruptData2Der Datenstrom hat fehlerhafte Daten gelesen.
QDataStream::WriteFailed3Der Datenstrom kann nicht in das zugrunde liegende Gerät schreiben.
QDataStream::SizeLimitExceeded (since Qt 6.7)4Der Datenstrom kann die Daten nicht lesen oder schreiben, weil ihre Größe größer ist als von der aktuellen Plattform unterstützt. Dies kann z. B. der Fall sein, wenn versucht wird, mehr als 2 GiB an Daten auf einer 32-Bit-Plattform zu lesen.

enum QDataStream::Version

Diese Aufzählung enthält symbolische Synonyme für die Versionsnummern der Daten-Serialisierungsformate.

KonstanteWertBeschreibung
QDataStream::Qt_1_01Version 1 (Qt 1.x)
QDataStream::Qt_2_02Version 2 (Qt 2.0)
QDataStream::Qt_2_13Version 3 (Qt 2.1, 2.2, 2.3)
QDataStream::Qt_3_04Version 4 (Qt 3.0)
QDataStream::Qt_3_15Version 5 (Qt 3.1, 3.2)
QDataStream::Qt_3_36Version 6 (Qt 3.3)
QDataStream::Qt_4_07Version 7 (Qt 4.0, Qt 4.1)
QDataStream::Qt_4_1Qt_4_0Version 7 (Qt 4.0, Qt 4.1)
QDataStream::Qt_4_28Version 8 (Qt 4.2)
QDataStream::Qt_4_39Version 9 (Qt 4.3)
QDataStream::Qt_4_410Version 10 (Qt 4.4)
QDataStream::Qt_4_511Version 11 (Qt 4.5)
QDataStream::Qt_4_612Version 12 (Qt 4.6, Qt 4.7, Qt 4.8)
QDataStream::Qt_4_7Qt_4_6Gleich wie Qt_4_6.
QDataStream::Qt_4_8Qt_4_7Dasselbe wie Qt_4_6.
QDataStream::Qt_4_9Qt_4_8Gleich wie Qt_4_6.
QDataStream::Qt_5_013Version 13 (Qt 5.0)
QDataStream::Qt_5_114Version 14 (Qt 5.1)
QDataStream::Qt_5_215Version 15 (Qt 5.2)
QDataStream::Qt_5_3Qt_5_2Gleich wie Qt_5_2
QDataStream::Qt_5_416Version 16 (Qt 5.4)
QDataStream::Qt_5_5Qt_5_4Gleich wie Qt_5_4
QDataStream::Qt_5_617Version 17 (Qt 5.6)
QDataStream::Qt_5_7Qt_5_6Gleich wie Qt_5_6
QDataStream::Qt_5_8Qt_5_7Gleich wie Qt_5_6
QDataStream::Qt_5_9Qt_5_8Gleich wie Qt_5_6
QDataStream::Qt_5_10Qt_5_9Dasselbe wie Qt_5_6
QDataStream::Qt_5_11Qt_5_10Gleich wie Qt_5_6
QDataStream::Qt_5_1218Version 18 (Qt 5.12)
QDataStream::Qt_5_1319Version 19 (Qt 5.13)
QDataStream::Qt_5_14Qt_5_13Gleich wie Qt_5_13
QDataStream::Qt_5_15Qt_5_14Gleich wie Qt_5_13
QDataStream::Qt_6_020Version 20 (Qt 6.0)
QDataStream::Qt_6_1Qt_6_0Gleich wie Qt_6_0
QDataStream::Qt_6_2Qt_6_0Gleich wie Qt_6_0
QDataStream::Qt_6_3Qt_6_0Gleich wie Qt_6_0
QDataStream::Qt_6_4Qt_6_0Gleich wie Qt_6_0
QDataStream::Qt_6_5Qt_6_0Gleich wie Qt_6_0
QDataStream::Qt_6_621Version 21 (Qt 6.6)
QDataStream::Qt_6_722Version 22 (Qt 6.7)
QDataStream::Qt_6_8Qt_6_7Gleich wie Qt_6_7

Siehe auch setVersion() und version().

Dokumentation der Mitgliedsfunktionen

QDataStream::QDataStream()

Konstruiert einen Datenstrom, der kein E/A-Gerät hat.

Siehe auch setDevice().

[explicit] QDataStream::QDataStream(QIODevice *d)

Konstruiert einen Datenstrom, der das E/A-Gerät d verwendet.

Siehe auch setDevice() und device().

QDataStream::QDataStream(const QByteArray &a)

Konstruiert einen Nur-Lese-Datenstrom, der mit dem Byte-Array a arbeitet. Verwenden Sie QDataStream(QByteArray*, int), wenn Sie in ein Byte-Array schreiben wollen.

Da QByteArray keine QIODevice Unterklasse ist, wird intern ein QBuffer erstellt, um das Byte-Array zu umhüllen.

QDataStream::QDataStream(QByteArray *a, QIODeviceBase::OpenMode mode)

Konstruiert einen Datenstrom, der auf einem Byte-Array arbeitet, a. Die mode beschreibt, wie das Gerät verwendet werden soll.

Alternativ können Sie QDataStream(const QByteArray &) verwenden, wenn Sie nur von einem Byte-Array lesen wollen.

Da QByteArray keine QIODevice Unterklasse ist, wird intern ein QBuffer erstellt, um das Byte-Array zu umhüllen.

[noexcept] QDataStream::~QDataStream()

Zerstört den Datenstrom.

Der Destruktor wirkt sich nicht auf das aktuelle E/A-Gerät aus, es sei denn, es handelt sich um ein internes E/A-Gerät (z. B. QBuffer), das ein im Konstruktor übergebenes 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 dem Verlust der Stream-Synchronisation abzubrechen.

Wird sie bei einer inneren Transaktion aufgerufen, wird der Abbruch an die äußerste Transaktion delegiert, und anschließend gestartete innere Transaktionen werden zum Scheitern gezwungen.

Für die äußerste Transaktion werden der Wiederherstellungspunkt und alle intern duplizierten Daten des Streams verworfen. Die aktuelle Leseposition des Streams wird nicht beeinflusst.

Setzt den Status des Datenstroms auf

KonstanteBeschreibung
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 Streams oder der Datei) erreicht hat oder wenn kein E/A-Gerät eingestellt ist; andernfalls wird false zurückgegeben.

Siehe auch QIODevice::atEnd().

QDataStream::ByteOrder QDataStream::byteOrder() const

Gibt die aktuelle Einstellung der Byte-Reihenfolge 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 false.

Wird die Funktion bei einer inneren Transaktion aufgerufen, wird die Übertragung verschoben, bis der äußerste Aufruf von commitTransaction(), rollbackTransaction() oder abortTransaction() erfolgt.

Andernfalls, wenn der Stream-Status anzeigt, dass das Lesen über das Ende der Daten hinausgeht, stellt diese Funktion die Stream-Daten an dem Punkt des startTransaction()-Aufrufs wieder her. In diesem Fall müssen Sie warten, bis weitere Daten eintreffen, und dann eine neue Transaktion starten. 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, wenn kein Gerät eingestellt ist.

Siehe auch setDevice().

QDataStream::FloatingPointPrecision QDataStream::floatingPointPrecision() const

Gibt die Fließkommagenauigkeit 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 einen Verweis auf den Stream zurück.

Der Puffer s wird mit new [] zugewiesen. Zerstören Sie ihn mit dem Operator delete [].

Der Parameter l wird auf die Länge des Puffers gesetzt. Wenn der gelesene String leer ist, wird l auf 0 und s auf nullptr gesetzt.

Das Serialisierungsformat ist zuerst ein Längenbezeichner, dann l Bytes der Daten. Der Längenspezifizierer 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 erweiterten Wert 0xfffffffe, gefolgt von einem quint64 mit dem aktuellen Wert. Bei Containern, die isNull() unterstützen, wird er zusätzlich als ein einzelner quint32 mit allen gesetzten Bits und ohne Daten kodiert.

Diese Funktion wurde in Qt 6.7 eingeführt.

Siehe auch readRawData() und writeBytes().

[until 6.11] QDataStream &QDataStream::readBytes(char *&s, uint &l)

Diese Funktion soll in Version 6.11 veraltet sein.

Verwenden Sie stattdessen eine Überladung, die qint64 length annimmt.

qint64 QDataStream::readRawData(char *s, qint64 len)

Liest maximal len Bytes aus dem Stream in s und gibt die Anzahl der gelesenen Bytes zurück. Wenn ein Fehler auftritt, gibt diese Funktion -1 zurück.

Der Puffer s muss vorab zugewiesen werden. 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 in der Regel verwendet, um die Transaktion zurückzusetzen, wenn vor dem Commit der Transaktion ein unvollständiger Lesevorgang festgestellt wurde.

Wird sie bei einer inneren Transaktion aufgerufen, wird die Rückgängigmachung an die äußerste Transaktion delegiert, und anschließend gestartete innere Transaktionen werden zum Scheitern gezwungen.

Bei der äußersten Transaktion werden die Daten des Datenstroms an dem Punkt wiederhergestellt, an dem der Aufruf startTransaction() erfolgte. Wenn der Datenstrom beschädigte Daten gelesen hat oder eine der inneren Transaktionen abgebrochen wurde, bricht diese Funktion die Transaktion ab.

Wenn die vorangegangenen Stream-Operationen erfolgreich waren, setzt sie den Status des Datenstroms auf

KonstanteBeschreibung
ReadPastEnd.

Siehe auch startTransaction(), commitTransaction(), und abortTransaction().

void QDataStream::setByteOrder(QDataStream::ByteOrder bo)

Setzt die Byte-Reihenfolge der Serialisierung auf bo.

Der Parameter bo kann QDataStream::BigEndian oder QDataStream::LittleEndian sein.

Die Standardeinstellung ist Big-Endian. Wir empfehlen, diese Einstellung beizubehalten, es sei denn, Sie haben besondere Anforderungen.

Siehe auch byteOrder().

void QDataStream::setDevice(QIODevice *d)

void QDataStream::setDevice(QIODevice *d)

Setzt das E/A-Gerät auf d, das mit nullptr auf das aktuelle E/A-Gerät zurückgesetzt werden kann.

Siehe auch device().

void QDataStream::setFloatingPointPrecision(QDataStream::FloatingPointPrecision precision)

Setzt die Fließkomma-Präzision des Datenstroms auf precision. Wenn die Fließkomma-Präzision DoublePrecision und die Version des Datenstroms Qt_4_6 oder höher ist, werden alle Fließkommazahlen mit 64-Bit-Präzision geschrieben und gelesen. Ist die Fließkommagenauigkeit SinglePrecision und die Version Qt_4_6 oder höher, werden alle Fließkommazahlen mit 32-Bit-Genauigkeit geschrieben und gelesen.

Bei Versionen vor Qt_4_6 hängt die Genauigkeit der Fließkommazahlen im Datenstrom von dem aufgerufenen Stream-Operator ab.

Die Voreinstellung ist DoublePrecision.

Beachten Sie, dass diese Eigenschaft keinen Einfluss auf die Serialisierung oder Deserialisierung von qfloat16 Instanzen hat.

Warnung: Diese Eigenschaft muss auf dem Objekt, das den Datenstrom schreibt, und dem Objekt, das ihn liest, auf denselben Wert gesetzt werden.

Siehe auch floatingPointPrecision().

void QDataStream::setStatus(QDataStream::Status status)

Setzt den Status des Datenstroms auf die angegebene 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 Daten-Serialisierungsformats auf v, einen Wert aus dem Version enum.

Sie müssen keine Version setzen, wenn Sie die aktuelle Version von Qt verwenden, aber für Ihre eigenen benutzerdefinierten Binärformate empfehlen wir Ihnen, dies zu tun; siehe Versioning in der detaillierten Beschreibung.

Um neue Funktionen unterzubringen, hat sich das Format der Serialisierung von Datenströmen einiger Qt-Klassen in einigen Versionen von Qt geändert. Wenn Sie Daten lesen wollen, die von einer früheren Version von Qt erstellt wurden, oder Daten schreiben wollen, die von einem Programm gelesen werden können, das mit einer früheren Version von Qt kompiliert wurde, verwenden Sie diese Funktion, um das von QDataStream verwendete Serialisierungsformat zu ändern.

Das Version enum bietet symbolische Konstanten für die verschiedenen Versionen von Qt. 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 bei einem Fehler.

Dies ist gleichbedeutend mit 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 Lesetransaktion auf dem Stream.

Definiert einen wiederherstellbaren Punkt innerhalb der Sequenz von Lesevorgängen. Bei sequentiellen Geräten werden die gelesenen Daten intern dupliziert, um eine Wiederherstellung im Falle unvollständiger Lesevorgänge 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, wird die Transaktion durch nachfolgende Aufrufe dieser Funktion rekursiv. Innere Transaktionen fungieren als Agenten der äußersten Transaktion (d. h. sie melden den Status von Leseoperationen an die äußerste Transaktion, die die Position des Streams wiederherstellen kann).

Hinweis: Die Wiederherstellung an der Stelle des geschachtelten startTransaction()-Aufrufs wird nicht unterstützt.

Wenn während einer Transaktion ein Fehler auftritt (einschließlich einer fehlgeschlagenen inneren Transaktion), wird das Lesen aus dem Datenstrom unterbrochen (alle nachfolgenden Leseoperationen geben leere/keine Werte zurück) und nachfolgende innere Transaktionen werden zum Fehlschlagen gezwungen. Durch den Start einer neuen, äußersten Transaktion wird dieser Zustand wiederhergestellt. Dieses Verhalten macht es unnötig, jeden Lesevorgang einzeln auf Fehler zu überprü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 Daten-Serialisierungsformats 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 einen Verweis auf den Stream zurück.

len wird als quint32 und ein optionales quint64 serialisiert, gefolgt von len Bytes von s. Beachten Sie, dass die Daten nicht kodiert sind.

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 bei einem Fehler. Die Daten werden nicht kodiert.

Siehe auch writeBytes(), QIODevice::write(), und readRawData().

QDataStream &QDataStream::operator<<(qint8 i)

Schreibt ein vorzeichenbehaftetes Byte, i, in den Stream und gibt einen Verweis auf den Stream zurück.

QDataStream &QDataStream::operator<<(bool i)

Dies ist eine überladene Funktion.

Schreibt einen booleschen Wert, i, in den Stream. Gibt einen Verweis auf den Stream zurück.

[since 6.0] QDataStream &QDataStream::operator<<(char16_t c)

Dies ist eine überladene Funktion.

Schreibt ein Zeichen, c, in den Stream. Gibt eine Referenz auf den Stream zurück

Diese Funktion wurde in Qt 6.0 eingeführt.

[since 6.0] QDataStream &QDataStream::operator<<(char32_t c)

Dies ist eine überladene Funktion.

Schreibt ein Zeichen, c, in den Stream. Gibt eine Referenz auf den Stream zurück

Diese Funktion wurde in Qt 6.0 eingeführt.

QDataStream &QDataStream::operator<<(const char *s)

Dies ist eine überladene Funktion.

Schreibt die '\0'-terminierte Zeichenkette s in den Stream und gibt eine Referenz auf den Stream zurück.

Die Zeichenkette wird mit writeBytes() serialisiert.

Siehe auch writeBytes() und writeRawData().

QDataStream &QDataStream::operator<<(double f)

Dies ist eine überladene Funktion.

Schreibt eine Fließkommazahl, f, in den Stream unter Verwendung des Standardformats IEEE 754. Gibt einen Verweis auf den Stream zurück.

Siehe auch setFloatingPointPrecision().

QDataStream &QDataStream::operator<<(float f)

Dies ist eine überladene Funktion.

Schreibt eine Fließkommazahl, f, in den Stream unter Verwendung des Standardformats IEEE 754. Gibt einen Verweis auf den Stream zurück.

Siehe auch setFloatingPointPrecision().

QDataStream &QDataStream::operator<<(qint16 i)

Dies ist eine überladene Funktion.

Schreibt eine vorzeichenbehaftete 16-Bit-Ganzzahl, i, in den Stream und gibt eine Referenz auf den Stream zurück.

QDataStream &QDataStream::operator<<(qint32 i)

Dies ist eine überladene Funktion.

Schreibt eine vorzeichenbehaftete 32-Bit-Ganzzahl, i, in den Stream und gibt einen Verweis auf den Stream zurück.

QDataStream &QDataStream::operator<<(qint64 i)

Dies ist eine überladene Funktion.

Schreibt eine vorzeichenbehaftete 64-Bit-Ganzzahl, i, in den Stream und gibt eine Referenz auf den Stream zurück.

QDataStream &QDataStream::operator<<(quint16 i)

Dies ist eine überladene Funktion.

Schreibt eine vorzeichenlose 16-Bit-Ganzzahl, i, in den Stream und gibt eine Referenz auf den Stream zurück.

QDataStream &QDataStream::operator<<(quint32 i)

Dies ist eine überladene Funktion.

Schreibt eine ganze Zahl ohne Vorzeichen, i, als 32-Bit-Ganzzahl ohne Vorzeichen (quint32) in den Stream. Gibt einen Verweis auf den Stream zurück.

QDataStream &QDataStream::operator<<(quint64 i)

Dies ist eine überladene Funktion.

Schreibt eine vorzeichenlose 64-Bit-Ganzzahl, i, in den Stream und gibt einen Verweis auf den Stream zurück.

QDataStream &QDataStream::operator<<(quint8 i)

Dies ist eine überladene Funktion.

Schreibt ein Byte ohne Vorzeichen, i, in den Stream und gibt einen Verweis auf den Stream zurück.

QDataStream &QDataStream::operator<<(std::nullptr_t ptr)

Dies ist eine überladene Funktion.

Simuliert das Schreiben eines std::nullptr_t, ptr, in den Stream und gibt einen Verweis auf den Stream zurück. Diese Funktion schreibt tatsächlich nichts in den Stream, da die Werte von std::nullptr_t als 0 Bytes gespeichert werden.

QDataStream &QDataStream::operator>>(bool &i)

Liest einen booleschen Wert aus dem Stream in i. Gibt einen Verweis auf den Stream zurück.

QDataStream &QDataStream::operator>>(qint8 &i)

Liest ein vorzeichenbehaftetes Byte aus dem Stream in i und gibt einen Verweis auf den Stream zurück.

QDataStream &QDataStream::operator>>(char *&s)

Dies ist eine überladene Funktion.

Liest die Zeichenkette s aus dem Stream und gibt einen Verweis auf den Stream zurück.

Die Zeichenkette wird unter Verwendung von readBytes() deserialisiert, wobei das Serialisierungsformat zuerst einen quint32 Längenspezifizierer enthält, gefolgt von so vielen Datenbytes. Die resultierende Zeichenkette ist immer '\0'-terminiert.

Der Platz für die Zeichenkette wird mit new [] zugewiesen - der Aufrufer muss ihn mit delete [] zerstören.

Siehe auch readBytes() und readRawData().

[since 6.0] QDataStream &QDataStream::operator>>(char16_t &c)

Dies ist eine überladene Funktion.

Liest ein 16bit breites Zeichen aus dem Stream in c und gibt eine Referenz auf den Stream zurück.

Diese Funktion wurde in Qt 6.0 eingeführt.

[since 6.0] QDataStream &QDataStream::operator>>(char32_t &c)

Dies ist eine überladene Funktion.

Liest ein 32bit breites Zeichen aus dem Stream in c und gibt eine Referenz auf den Stream zurück.

Diese Funktion wurde in Qt 6.0 eingeführt.

QDataStream &QDataStream::operator>>(double &f)

Dies ist eine überladene Funktion.

Liest eine Fließkommazahl aus dem Stream in f, wobei das Standardformat IEEE 754 verwendet wird. Gibt einen Verweis auf den Stream zurück.

Siehe auch setFloatingPointPrecision().

QDataStream &QDataStream::operator>>(float &f)

Dies ist eine überladene Funktion.

Liest eine Fließkommazahl aus dem Stream in f, wobei das Standardformat IEEE 754 verwendet wird. Gibt einen Verweis auf den Stream zurück.

Siehe auch setFloatingPointPrecision().

QDataStream &QDataStream::operator>>(qint16 &i)

Dies ist eine überladene Funktion.

Liest eine 16-Bit-Ganzzahl mit Vorzeichen aus dem Stream in i und gibt einen Verweis auf den Stream zurück.

QDataStream &QDataStream::operator>>(qint32 &i)

Dies ist eine überladene Funktion.

Liest eine vorzeichenbehaftete 32-Bit-Ganzzahl aus dem Stream in i und gibt einen Verweis auf den Stream zurück.

QDataStream &QDataStream::operator>>(qint64 &i)

Dies ist eine überladene Funktion.

Liest eine vorzeichenbehaftete 64-Bit-Ganzzahl aus dem Stream in i und gibt einen Verweis auf den Stream zurück.

QDataStream &QDataStream::operator>>(quint16 &i)

Dies ist eine überladene Funktion.

Liest eine vorzeichenlose 16-Bit-Ganzzahl aus dem Stream in i und gibt einen Verweis auf den Stream zurück.

QDataStream &QDataStream::operator>>(quint32 &i)

Dies ist eine überladene Funktion.

Liest eine 32-Bit-Ganzzahl ohne Vorzeichen aus dem Stream in i und gibt einen Verweis auf den Stream zurück.

QDataStream &QDataStream::operator>>(quint64 &i)

Dies ist eine überladene Funktion.

Liest eine vorzeichenlose 64-Bit-Ganzzahl aus dem Stream in i und gibt einen Verweis auf den Stream zurück.

QDataStream &QDataStream::operator>>(quint8 &i)

Dies ist eine überladene Funktion.

Liest ein Byte ohne Vorzeichen aus dem Stream in i und gibt eine Referenz auf den Stream zurück.

QDataStream &QDataStream::operator>>(std::nullptr_t &ptr)

Dies ist eine überladene Funktion.

Simuliert das Lesen eines std::nullptr_t aus dem Stream in ptr und gibt einen Verweis auf den Stream zurück. Diese Funktion liest nicht wirklich etwas aus dem Stream, da std::nullptr_t Werte als 0 Bytes gespeichert werden.

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 benötigt die Typen T1 und T2, um operator<<() zu implementieren.

Diese Funktion wurde in Qt 6.0 eingeführt.

Siehe auch Serialisierung von Qt-Datentypen.

[since 6.0] template <typename T1, typename T2> QDataStream &operator>>(QDataStream &in, std::pair<T1, T2> &pair)

Liest ein Paar aus Stream in in pair.

Diese Funktion benötigt die Typen T1 und T2, um operator>>() zu implementieren.

Diese Funktion wurde in Qt 6.0 eingeführt.

Siehe auch Serialisierung von Qt-Datentypen.

© 2025 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.