本页内容

QCborStreamReader Class

QCborStreamReader 类是一个简单的 CBOR 流解码器,可处理QByteArray 或QIODevice 。更多内容...

头文件: #include <QCborStreamReader>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

注意:该类中的所有函数均为可重入的。

公共类型

struct StringResult
enum StringResultCode { EndOfString, Ok, Error }
enum Type { UnsignedInteger, NegativeInteger, ByteArray, ByteString, String, …, Invalid }

公共函数

QCborStreamReader()
QCborStreamReader(QIODevice *device)
QCborStreamReader(const QByteArray &data)
QCborStreamReader(const char *data, qsizetype len)
QCborStreamReader(const quint8 *data, qsizetype len)
QCborStreamReader(const QCborStreamReader &)
~QCborStreamReader()
void addData(const QByteArray &data)
void addData(const char *data, qsizetype len)
void addData(const quint8 *data, qsizetype len)
void clear()
int containerDepth() const
qint64 currentOffset() const
qsizetype currentStringChunkSize() const
QIODevice *device() const
bool enterContainer()
bool hasNext() const
bool isArray() const
bool isBool() const
bool isByteArray() const
bool isContainer() const
bool isDouble() const
bool isFalse() const
bool isFloat16() const
bool isFloat() const
bool isInteger() const
bool isInvalid() const
bool isLengthKnown() const
bool isMap() const
bool isNegativeInteger() const
bool isNull() const
bool isSimpleType() const
bool isSimpleType(QCborSimpleType st) const
bool isString() const
bool isTag() const
bool isTrue() const
bool isUndefined() const
bool isUnsignedInteger() const
bool isValid() const
QCborError lastError() const
bool leaveContainer()
quint64 length() const
bool next(int maxRecursion = 10000)
QCborStreamReader::Type parentContainerType() const
(since 6.7) QByteArray readAllByteArray()
(since 6.7) QString readAllString()
(since 6.7) QByteArray readAllUtf8String()
(since 6.7) bool readAndAppendToByteArray(QByteArray &dst)
(since 6.7) bool readAndAppendToString(QString &dst)
(since 6.7) bool readAndAppendToUtf8String(QByteArray &dst)
QCborStreamReader::StringResult<QByteArray> readByteArray()
QCborStreamReader::StringResult<QString> readString()
QCborStreamReader::StringResult<qsizetype> readStringChunk(char *ptr, qsizetype maxlen)
(since 6.7) QCborStreamReader::StringResult<QByteArray> readUtf8String()
void reparse()
void reset()
void setDevice(QIODevice *device)
bool toBool() const
double toDouble() const
qfloat16 toFloat16() const
float toFloat() const
qint64 toInteger() const
QCborNegativeInteger toNegativeInteger() const
QCborSimpleType toSimpleType() const
QCborTag toTag() const
quint64 toUnsignedInteger() const
QCborStreamReader::Type type() const
QCborStreamReader &operator=(const QCborStreamReader &)

详细说明

该类可用于直接从QByteArray 或QIODevice 解码CBOR内容流。CBOR是“简明二进制对象表示法”(Concise Binary Object Representation),是一种非常紧凑的二进制数据编码形式,与JSON兼容。 它由 IETF 受限 RESTful 环境 (CoRE) 工作组创建,该工作组已在许多新的 RFC 中使用了它。它旨在与CoAP 协议配合使用。

QCborStreamReader 提供了一个类似于 StAX 的 API,与QXmlStreamReader 中的 API 相似。使用它需要对 CBOR 编码有一定的了解。如需更简单的 API,请参阅QCborValue ,特别是解码函数QCborValue::fromCbor()。

通常,通过将源QByteArray 或QIODevice 作为参数传递给构造函数来创建 QCborStreamReader,然后在解码无误的情况下从流中弹出元素。CBOR 类型有三种:

类型类型行为
固定宽度整数、标签、简单类型、浮点数值由QCborStreamReader预先解析,因此访问函数为const 。必须调用next()来推进。
字符串字节数组、文本字符串长度(若已知)会预先解析,但字符串本身不会。访问函数不是 const 类型,可能会分配内存。一旦调用,访问函数会自动前进到下一个元素。
容器数组、映射长度(若已知)会预先解析。要访问元素,必须先调用 `enterContainer()` 读取所有元素,然后调用 `leaveContainer()`。该函数会自动跳转到下一个元素。

因此,处理函数通常如下所示:

void handleStream(QCborStreamReader &reader)
{
    switch (reader.type())
    {
    case QCborStreamReader::UnsignedInteger:
    case QCborStreamReader::NegativeInteger:
    case QCborStreamReader::SimpleType:
    case QCborStreamReader::Float16:
    case QCborStreamReader::Float:
    case QCborStreamReader::Double:
        handleFixedWidth(reader);
        reader.next();
        break;
    case QCborStreamReader::ByteArray:
    case QCborStreamReader::String:
        handleString(reader);
        break;
    case QCborStreamReader::Array:
    case QCborStreamReader::Map:
        reader.enterContainer();
        while (reader.lastError() == QCborError::NoError)
            handleStream(reader);
        if (reader.lastError() == QCborError::NoError)
            reader.leaveContainer();
    }

}

CBOR 支持

下表列出了 QCborStreamReader 支持的 CBOR 功能。

特性支持
无符号数是(全范围)
负数是(全范围)
字节字符串是
文本字符串是
分块字符串是
标签是(任意)
布尔值是
空是
未定义是
任意简单值是
半精度浮点数(16 位)是
单精度浮点数(32 位)是
双精度浮点数(64 位)是
无穷大与NaN浮点数是
确定长度的数组和映射是
不定长数组和映射是
除字符串和整数以外的映射键类型是(任意)

处理无效或不完整的 CBOR 流

QCborStreamReader 能够自主检测损坏的输入。其所使用的库已经针对各类无效输入进行了广泛测试,完全能够报告错误。若检测到任何错误,QCborStreamReader 将把 `lastError()` 设置为除 `QCborError::NoError` 以外的值,以指示检测到何种情况。

QCborStreamReader在正常项目解析过程中检测到的绝大多数错误均无法恢复。使用QCborStreamReader的代码可以选择处理已正确解码的数据,也可以选择丢弃全部数据。

唯一可恢复的错误是QCborError::EndOfFile ,这表示需要更多数据才能完成解析。当从异步源(如管道(QProcess )或套接字(QTcpSocket 、QUdpSocket 、QNetworkReply 等))读取数据时,这种情况非常有用。 当有更多数据到达时,周围的代码需要调用addData()(如果从QByteArray 进行解析),或者reparse()(如果直接从现在已有更多数据的QIDOevice读取数据,参见setDevice())。

另请参阅 QCborStreamWriter 、QCborValue 、QXmlStreamReader 、解析和显示 CBOR 数据、序列化转换器以及保存和加载游戏。

成员类型文档

enum QCborStreamReader::StringResultCode

该枚举由readString() 和readByteArray() 返回,用于指示解析的状态。

常量常量值描述
QCborStreamReader::EndOfString0字符串的解析已完成,且未出现错误。
QCborStreamReader::Ok1函数返回了数据;没有错误。
QCborStreamReader::Error-1解析失败,出现错误。

enum QCborStreamReader::Type

此枚举包含所有由QCborStreamReader 解码的可能CBOR类型。CBOR有7种主要类型,此外还有若干不携带值的简单类型以及浮点值。

常量值描述
QCborStreamReader::UnsignedInteger0x00(主要类型 0)范围为 0 到264- 1(18,446,744,073,709,551,616)
QCborStreamReader::NegativeInteger0x20(主要类型 1)范围为 -1 到-264(-18,446,744,073,709,551,616)
QCborStreamReader::ByteArrayByteString(主要类型 2) 任意二进制数据。
QCborStreamReader::ByteString0x40ByteArray 的别名。
QCborStreamReader::StringTextString(主要类型 3)Unicode 文本,可能包含 NUL 字符。
QCborStreamReader::TextString0x60String 的别名
QCborStreamReader::Array0x80(主要类型 4) 异构项的数组。
QCborStreamReader::Map0xa0(主要类型 5) 异构项的映射/字典。
QCborStreamReader::Tag0xc0(主要类型 6) 为通用 CBOR 项提供进一步语义值的数字。更多信息请参见QCborTag 。
QCborStreamReader::SimpleType0xe0(主要类型 7) 不承载额外值的类型。包括布尔值(true 和 false)、null、undefined。
QCborStreamReader::Float16HalfFloatIEEE 754 半精度浮点数(qfloat16 )。
QCborStreamReader::HalfFloat0xf9Float16 的别名。
QCborStreamReader::Float0xfaIEEE 754 单精度浮点数(float )。
QCborStreamReader::Double0xfbIEEE 754 双精度浮点数(double )。
QCborStreamReader::Invalid0xff不是有效类型,原因可能是解析错误,或者到达了数组或映射的末尾。

成员函数文档

QCborStreamReader::QCborStreamReader()

创建一个没有源数据的 QCborStreamReader 对象。创建完成后,QCborStreamReader 将报告解析错误。

您可以通过调用 `addData()` 或使用 `setDevice()` 设置其他源设备来添加更多数据。

另请参阅 addData() 和isValid()。

[explicit] QCborStreamReader::QCborStreamReader(QIODevice *device)

创建一个 QCborStreamReader 对象,该对象将解析通过从device 读取而找到的 CBOR 流。QCborStreamReader 不会接管device 的所有权,因此该资源必须保持有效,直到该对象被销毁为止。

这是一个重载函数。

[explicit] QCborStreamReader::QCborStreamReader(const QByteArray &data)

创建一个 QCborStreamReader 对象,用于解析位于data 中的 CBOR 流。

这是一个重载函数。

QCborStreamReader::QCborStreamReader(const char *data, qsizetype len)

创建一个 QCborStreamReader 对象,其中包含从data 开始的len 字节数据。该指针必须在 QCborStreamReader 被销毁之前始终保持有效。

这是一个重载函数。

QCborStreamReader::QCborStreamReader(const quint8 *data, qsizetype len)

创建一个 QCborStreamReader 对象,其中包含从data 开始的len 字节数据。该指针必须在 QCborStreamReader 被销毁之前始终保持有效。

这是一个重载函数。

[delete] QCborStreamReader::QCborStreamReader(const QCborStreamReader &)

复制并构造一个QCborStreamReader 实例。该函数已被删除。

[noexcept] QCborStreamReader::~QCborStreamReader()

销毁此QCborStreamReader 对象,并释放所有相关资源。

void QCborStreamReader::addData(const QByteArray &data)

将data 添加到CBOR流中,并重新解析当前元素。如果在处理流的过程中此前已到达数据末尾,但现在又有更多数据可用,则此函数非常有用。

void QCborStreamReader::addData(const char *data, qsizetype len)

将从data 开始的len 字节数据添加到 CBOR 流中,并重新解析当前元素。如果在处理流的过程中之前已到达数据末尾,但现在又有更多数据可用,则此函数非常有用。

这是一个重载函数。

void QCborStreamReader::addData(const quint8 *data, qsizetype len)

将从data 开始的len 字节数据添加到CBOR流中,并重新解析当前元素。如果在处理流的过程中之前已到达数据末尾,但现在又有更多数据可用,则此函数非常有用。

这是一个重载函数。

void QCborStreamReader::clear()

清除解码器状态,并将输入源数据重置为空字节数组。调用此函数后,QCborStreamReader 将指示解析错误。

调用addData() 向待解析的数据中添加更多数据。

另请参阅 reset() 和setDevice()。

int QCborStreamReader::containerDepth() const

返回该流已通过 `enterContainer()` 进入但尚未离开的容器数量。

另请参阅 enterContainer() 和leaveContainer()。

qint64 QCborStreamReader::currentOffset() const

返回当前正在解码的项在输入流中的偏移量。只有当源数据为QByteArray ,或者为在解码开始时已定位到其开头的QIODevice 时,当前偏移量才表示迄今为止已解码的字节数。

另请参阅 reset()、clear() 和device()。

qsizetype QCborStreamReader::currentStringChunkSize() const

返回当前文本或字节字符串块的大小。如果 CBOR 流包含一个非分块字符串(即,如果isLengthKnown() 返回true ),则该函数返回整个字符串的大小,这与length() 的返回结果相同。

此函数可用于预先分配一个缓冲区,其指针随后可传递给readStringChunk()。

另请参阅 readString()、readByteArray()、readStringChunk() 函数。

QIODevice *QCborStreamReader::device() const

返回通过 `setDevice()` 或 `QCborStreamReader ` 构造函数设置的 `QIODevice `。如果该对象是从 `QByteArray` 读取数据,则此函数返回 `nullptr`。

另请参阅 setDevice()。

bool QCborStreamReader::enterContainer()

进入作为当前项的数组或映射,并为遍历容器中的元素做好准备。如果成功进入容器,则返回 true;否则返回 false(通常表示解析错误)。每次调用 enterContainer() 都必须与调用leaveContainer() 配对。

仅当当前项为数组或映射时(即当isArray()、isMap() 或isContainer() 返回 true 时),才可调用此函数。在任何其他情况下调用该函数均会引发错误。

另请参见 leaveContainer()、isContainer()、isArray() 以及isMap()。

[noexcept] bool QCborStreamReader::hasNext() const

如果当前容器中还有待解析的项目,则返回 true;如果已到达容器末尾,则返回 false。如果正在解析根元素,hasNext() 返回 false 表示解析已完成;否则,如果容器深度不为零,则外部代码需要调用leaveContainer()。

另请参阅 parentContainerType()、containerDepth() 和leaveContainer()。

bool QCborStreamReader::isArray() const

如果当前元素的类型是数组(即,如果 `type()` 返回 `QCborStreamReader::Array`),则返回 `true`。如果此函数返回 `true`,您可以调用 `enterContainer()` 来开始解析该容器。

当当前元素为数组时,您还可以调用 `isLengthKnown()` 来判断该数组的大小是否在 CBOR 流中显式指定。如果是,则可通过调用 `length()` 获取该大小。

以下示例根据数组的大小预先分配一个 `QVariantList `,以实现更高效的解码:

QVariantList populateFromCbor(QCborStreamReader &reader)
{
    QVariantList list;
    if (reader.isLengthKnown())
        list.reserve(reader.length());

    reader.enterContainer();
    while (reader.lastError() == QCborError::NoError && reader.hasNext())
        list.append(readOneElement(reader));
    if (reader.lastError() == QCborError::NoError)
        reader.leaveContainer();

    return list;
}

注意: 上述代码 并未验证长度是否为合理值。如果输入流报告长度为 10 亿个元素,上述函数将尝试分配约 16 GB 或更多的内存,这可能会导致程序崩溃。

另请参阅 type()、isMap()、isLengthKnown()、length()、enterContainer(),以及leaveContainer()。

bool QCborStreamReader::isBool() const

如果当前元素是布尔值(true 或false ),则返回 true;如果是其他任何值,则返回 false。如果此函数返回 true,您可以调用toBool() 来获取该布尔值的值。您还可以调用toSimpleType(),并将其与 QCborSimpleValue::True 或 QCborSimpleValue::False 进行比较。

另请参阅 type()、isFalse()、isTrue()、toBool()、isSimpleType() 以及toSimpleType()。

bool QCborStreamReader::isByteArray() const

如果当前元素的类型是字节数组(即,如果type() 返回QCborStreamReader::ByteArray ),则返回 true。如果此函数返回 true,您可以调用readByteArray() 来读取该数据。

另请参阅 type()、readByteArray() 和isString()。

bool QCborStreamReader::isContainer() const

如果当前元素是一个容器(即数组或映射),则返回 true;否则返回 false。如果当前元素是一个容器,可以使用isLengthKnown() 函数来判断该容器的大小是否在流中明确指定;如果是,则可以使用length() 获取该大小。

更重要的是,对于容器,可以使用enterContainer() 函数开始遍历其中包含的元素。

另请参阅 type()、isArray()、isMap()、isLengthKnown()、length()、enterContainer()、leaveContainer() 以及containerDepth()。

bool QCborStreamReader::isDouble() const

如果当前元素的类型是 IEEE 754 双精度浮点数(即,如果type() 返回QCborStreamReader::Double ),则返回 true。如果该函数返回 true,则可以调用toDouble() 来读取该数据。

另请参阅 type()、toDouble()、isFloat16() 和isFloat()。

bool QCborStreamReader::isFalse() const

如果当前元素是false 的值,则返回true;如果是其他任何值,则返回false。

另请参阅 type()、isTrue()、isBool()、toBool()、isSimpleType(),以及toSimpleType()。

bool QCborStreamReader::isFloat16() const

如果当前元素的类型是 IEEE 754 半精度浮点数(即,如果type() 返回QCborStreamReader::Float16 ),则返回 true。如果该函数返回 true,则可以调用toFloat16() 来读取该数据。

另请参阅 type()、toFloat16()、isFloat() 和isDouble()。

bool QCborStreamReader::isFloat() const

如果当前元素的类型是 IEEE 754 单精度浮点数(即,如果type() 返回QCborStreamReader::Float ),则返回 true。如果该函数返回 true,您可以调用toFloat() 来读取该数据。

另请参见 type()、toFloat()、isFloat16() 和isDouble()。

bool QCborStreamReader::isInteger() const

如果当前元素的类型为无符号整数或负数(即,当调用type() 时返回QCborStreamReader::UnsignedInteger 或QCborStreamReader::NegativeInteger ),则返回 true。如果该函数返回 true,则可调用toInteger() 读取该值。

另请参阅 type()、toInteger()、toUnsignedInteger()、toNegativeInteger()、isUnsignedInteger() 以及isNegativeInteger()。

bool QCborStreamReader::isInvalid() const

如果当前元素无效,则返回 true;否则返回 false。如果发生解码错误,或者我们刚刚解析了数组或映射中的最后一个元素,则当前元素可能无效。

注意: 请勿将此 函数与isNull() 混淆。Null 是一种常规的 CBOR 类型,必须由应用程序进行处理。

另请参阅 type() 和isValid()。

[noexcept] bool QCborStreamReader::isLengthKnown() const

如果当前数组、映射、字节数组或字符串的长度已知(在 CBOR 流中显式指定),则返回 true;否则返回 false。仅当元素属于上述类型之一时,才应调用此函数。

如果长度已知,可通过调用length() 获取。

如果映射或数组的长度未知,则由流中存在的元素个数隐含决定。QCborStreamReader 在这种情况下没有用于计算长度的 API。

字符串和字节数组也可能具有不定长度(即,它们可能分多个块传输)。虽然目前无法使用QCborStreamWriter 创建此类数据,但其他编码器可以创建,因此QCborStreamReader 支持它们。

另请参阅 length()、QCborStreamWriter::startArray() 和QCborStreamWriter::startMap()。

bool QCborStreamReader::isMap() const

如果当前元素的类型是映射(即,如果 `type()` 返回 `QCborStreamReader::Map`),则返回 `true`。如果此函数返回 `true`,您可以调用 `enterContainer()` 来开始解析该容器。

当当前元素为映射时,您还可以调用isLengthKnown() 来判断该映射的大小是否在 CBOR 流中显式指定。如果是,则可通过调用length() 获取该大小。

以下示例根据地图的大小预先分配一个 `QVariantMap `,以提高解码效率:

QVariantMap populateFromCbor(QCborStreamReader &reader)
{
    QVariantMap map;
    if (reader.isLengthKnown())
        map = setMapLength(map, reader.length());

    reader.enterContainer();
    while (reader.lastError() == QCborError::NoError && reader.hasNext()) {
        QString key = readElementAsString(reader);
        map.insert(key, readOneElement(reader));
    }
    if (reader.lastError() == QCborError::NoError)
        reader.leaveContainer();

    return map;
}

上述示例使用名为readElementAsString 的函数来读取映射的键并获取字符串。这是因为 CBOR 映射中的键可能包含任何类型,而不仅仅是字符串。 用户代码需要执行此转换、拒绝非字符串键,或者改用QVariantMap 和QVariantHash 以外的其他容器。例如,如果预期映射包含整数键(建议这样做,因为这可以减少流大小并简化解析),则正确的容器应为\l{QMap}<int, QVariant> 或\l{QHash}<int, QVariant> 。

注意: 上述代码 并未验证长度是否为合理值。如果输入流报告长度为 10 亿个元素,上述函数将尝试分配约 24 GB 或更多的内存,这可能会导致程序崩溃。

另请参阅 type()、isArray()、isLengthKnown()、length()、enterContainer() 以及leaveContainer()。

bool QCborStreamReader::isNegativeInteger() const

如果当前元素的类型为负整数(即当type()返回QCborStreamReader::NegativeInteger 时),则返回true。如果该函数返回true,您可以调用toNegativeInteger()或toInteger()来读取该值。

另请参见 type()、toNegativeInteger()、toInteger()、isInteger(),以及isUnsignedInteger()。

bool QCborStreamReader::isNull() const

如果当前元素是null 值,则返回true;如果是其他任何值,则返回false。Null值可用于表示某些可选数据缺失。

注意:此 函数并非isValid() 的反向操作。Null 值是一个有效的 CBOR 值。

另请参阅 type()、isSimpleType() 和toSimpleType()。

bool QCborStreamReader::isSimpleType() const

如果当前元素的类型是任何 CBOR 简单类型(包括布尔值(true 和 false)以及 null 和 undefined),则返回 true。要确定这是哪种简单类型,请调用 `toSimpleType()`。或者,若要检测特定的一种简单类型,请调用接受 `QCborSimpleType ` 参数的重载方法。

CBOR 简单类型是不携带额外值的类型。虽然共有 255 种可能,但目前只有四种值具有明确的含义。代码不应处理未知简单类型,若遇到未知类型,可直接将该流视为无效并丢弃。

另请参阅 QCborSimpleType 、type()、isSimpleType (QCborSimpleType)以及toSimpleType()。

bool QCborStreamReader::isSimpleType(QCborSimpleType st) const

如果当前元素的类型是简单类型st ,则返回true;否则返回false。如果该函数返回true,则toSimpleType()将返回st 。

CBOR 简单类型是不携带额外值的类型。共有 255 种可能,但目前只有四种值具有明确的含义。代码不应处理未知简单类型,若遇到未知类型,可直接将该流视为无效并丢弃。

另请参阅 QCborSimpleType 、type()、isSimpleType() 以及toSimpleType()。

bool QCborStreamReader::isString() const

如果当前元素的类型是文本字符串(即当type()返回QCborStreamReader::String 时),则返回true。如果该函数返回true,则可调用readString()来读取该数据。

另请参阅 type()、readString() 和isByteArray()。

bool QCborStreamReader::isTag() const

如果当前元素的类型是 CBOR 标签(即,如果type() 返回QCborStreamReader::Tag ),则返回 true。如果此函数返回 true,则可以调用toTag() 来读取该数据。

另请参阅 type() 和toTag()。

bool QCborStreamReader::isTrue() const

如果当前元素是true 的值,则返回true;如果是其他任何值,则返回false。

另请参阅 type()、isFalse()、isBool()、toBool()、isSimpleType(),以及toSimpleType()。

bool QCborStreamReader::isUndefined() const

如果当前元素是undefined 的值,则返回true;如果是其他任何值,则返回false。未定义的值可能会被编码,以表明在创建流时某些转换失败或无法进行。QCborStreamReader 从不执行任何替换,且该函数仅在流中包含显式的未定义值时才返回true。

另请参阅 type()、isSimpleType()、以及toSimpleType()。

bool QCborStreamReader::isUnsignedInteger() const

如果当前元素的类型为无符号整数(即当type()返回QCborStreamReader::UnsignedInteger 时),则返回true。如果该函数返回true,则可以调用toUnsignedInteger()或toInteger()来读取该值。

另请参阅 type()、toUnsignedInteger()、toInteger()、isInteger() 以及isNegativeInteger()。

bool QCborStreamReader::isValid() const

如果当前元素有效,则返回 true;否则返回 false。如果发生解码错误,或者我们刚刚解析了数组或映射中的最后一个元素,则当前元素可能无效。

注意:此 函数并非isNull()的反向操作。Null是一种普通的CBOR类型,必须由应用程序进行处理。

另请参阅 type() 和isInvalid()。

QCborError QCborStreamReader::lastError() const

返回流解码过程中遇到的最后一个错误(如有)。如果未遇到错误,则返回QCborError::NoError 。

另请参阅 isValid()。

bool QCborStreamReader::leaveContainer()

退出正在处理其项的数组或映射,并将解码器定位到容器末尾后的下一个项。如果成功退出容器,则返回 true;否则返回 false(通常表示解析错误)。每次调用 `enterContainer()` 都必须与一次 `leaveContainer()` 的调用配对。

仅当hasNext()返回false且containerDepth()不为零时,才可调用此函数。在任何其他情况下调用此函数均视为错误。

另请参见 enterContainer()、parentContainerType() 和containerDepth()。

quint64 QCborStreamReader::length() const

返回字符串或字节数组的长度,或者数组中的元素个数,或是映射中的元素对数量(若已知)。如果长度未知(即isLengthKnown()返回false),则不得调用此函数。 这样做会引发错误,并导致 `QCborStreamReader ` 停止解析输入流。

另请参阅 isLengthKnown()、QCborStreamWriter::startArray() 和QCborStreamWriter::startMap()。

bool QCborStreamReader::next(int maxRecursion = 10000)

将 CBOR 流的解码位置向前推进一个元素。通常在解析固定宽度的基本元素(即整数、简单值、标签和浮点数)时应调用此函数。但当当前项为字符串、数组或映射时,也可调用此函数,此时它将跳过该元素的全部内容,包括其中包含的所有子元素。

如果推进成功,该函数返回 true;否则返回 false。如果流已损坏、不完整,或者数组和映射的嵌套层级超过maxRecursion 规定的限制,则可能失败。当hasNext() 返回 false 时调用此函数也会导致错误。如果此函数返回 false,lastError() 将返回详细说明失败原因的错误代码。

另请参阅 lastError()、isValid() 和hasNext()。

QCborStreamReader::Type QCborStreamReader::parentContainerType() const

返回QCborStreamReader::Array 或QCborStreamReader::Map ,分别表示包含当前项的容器是数组还是映射。如果当前正在解析根元素,则该函数返回QCborStreamReader::Invalid 。

另请参阅 containerDepth() 和enterContainer()。

[since 6.7] QByteArray QCborStreamReader::readAllByteArray()

解码当前字节串并返回该字节串。如果该字节串被分块,则该函数将遍历所有块并将它们拼接起来。 如果发生错误,该函数将返回一个默认构造的 QByteArray(),但这可能与某些空字节串无法区分。因此,请检查lastError() 以确定是否发生了错误。

该函数不执行任何类型转换,包括从整数或字符串转换。因此,仅当isByteArray() 为真时才可调用该函数;在任何其他情况下调用它均视为错误。

注意:此 函数无法恢复执行。也就是说,不应在可能仍在接收 CBOR 数据的上下文中使用此函数,例如从套接字或管道接收数据。仅当已接收完整数据且该数据可通过输入参数QByteArray 或QIODevice 获取时,才应使用此函数。

该函数在 Qt 6.7 中引入。

另请参阅 readByteArray()、readStringChunk()、isByteArray() 和readAllString()。

[since 6.7] QString QCborStreamReader::readAllString()

对当前文本字符串进行解码并返回结果。如果字符串被分块,该函数将遍历所有块并将它们拼接起来。如果发生错误,该函数将返回一个默认构造的 QString(),但这可能与某些空文本字符串无法区分。因此,请检查lastError() 以确定是否发生错误。

该函数不执行任何类型转换,包括从整数或字节数组转换。因此,仅当isString() 返回 true 时才可调用该函数;在任何其他情况下调用它均视为错误。

注意:此 函数无法被恢复。也就是说,不应在可能仍在接收 CBOR 数据的上下文中使用此函数,例如通过套接字或管道接收数据。仅当已接收完整数据且数据已存在于输入参数QByteArray 或QIODevice 中时,才应使用此函数。

该函数在 Qt 6.7 中引入。

另请参阅 readString()、readStringChunk()、isString() 和readAllByteArray()。

[since 6.7] QByteArray QCborStreamReader::readAllUtf8String()

对当前文本字符串进行解码并返回。如果字符串被分块,该函数将遍历所有块并将它们拼接起来。如果发生错误,该函数将返回一个默认构造的 QString(),但这可能与某些空文本字符串无法区分。因此,请检查lastError() 以确定是否发生错误。

该函数不会执行任何类型转换,包括从整数或字节数组进行的转换。因此,仅当isString() 返回 true 时才可调用该函数;在任何其他情况下调用它均视为错误。

注意:此 函数无法恢复执行。也就是说,不应在仍可能接收 CBOR 数据的上下文中使用此函数,例如从套接字或管道接收数据。它仅应在已接收完整数据且数据已存在于输入参数QByteArray 或QIODevice 中时使用。

该函数在 Qt 6.7 中引入。

另请参阅 readString()、readStringChunk()、isString() 和readAllByteArray()。

[since 6.7] bool QCborStreamReader::readAndAppendToByteArray(QByteArray &dst)

对当前字节串进行解码,并将其追加到dst 中。如果该字符串被分块存储,则该函数将遍历所有块并将其拼接起来。如果解码过程中发生错误,其他能够成功解码的块仍可能已被写入dst 。如果解码过程未发生错误,则返回true ;否则返回false 。

该函数不执行任何类型转换,包括从整数或字符串的转换。因此,仅当 `isByteArray()` 为真时才可调用该函数;在任何其他情况下调用它都将引发错误。

注意:此 函数无法恢复。也就是说,不应在可能仍在接收 CBOR 数据的上下文中使用此函数,例如从套接字或管道接收数据。仅当已接收完整数据且该数据可在输入参数QByteArray 或QIODevice 中获取时,才应使用此函数。

该函数自 Qt 6.7 起引入。

另请参阅 readByteArray()、readStringChunk()、isByteArray() 和readAndAppendToString()。

[since 6.7] bool QCborStreamReader::readAndAppendToString(QString &dst)

对当前文本字符串进行解码,并将结果追加到dst 中。如果字符串被分块,该函数将遍历所有块并将其拼接起来。如果在解码过程中发生错误,其他能够成功解码的块仍可能已被写入dst 。如果解码过程未发生错误,则返回true ;否则返回false 。

该函数不执行任何类型转换,包括从整数或字节数组进行的转换。因此,仅当isString() 返回 true 时才可调用该函数;在任何其他情况下调用它都将引发错误。

注意:此 函数无法恢复执行。也就是说,不应在可能仍在接收 CBOR 数据的上下文中使用此函数,例如来自套接字或管道的数据。仅当已接收完整数据且该数据可在输入参数QByteArray 或QIODevice 中获取时,才应使用此函数。

该函数在 Qt 6.7 中引入。

另请参阅 readString()、readStringChunk()、isString() 和readAndAppendToByteArray()。

[since 6.7] bool QCborStreamReader::readAndAppendToUtf8String(QByteArray &dst)

对当前文本字符串进行解码,并将结果追加到dst 中。如果字符串被分块存储,该函数将遍历所有块并将其拼接起来。如果在解码过程中发生错误,其他能够成功解码的块仍可能已被写入dst 。如果解码过程未发生错误,则返回true ;否则返回false 。

该函数不执行任何类型转换,包括从整数或字节数组进行的转换。因此,仅当isString() 返回 true 时才可调用该函数;在任何其他情况下调用它都将引发错误。

注意:此 函数无法恢复。也就是说,不应在可能仍在接收 CBOR 数据的上下文中使用此函数,例如通过套接字或管道接收数据。仅当已接收完整数据且该数据可在输入参数QByteArray 或QIODevice 中获取时,才应使用此函数。

该函数于 Qt 6.7 中引入。

另请参阅 readString()、readStringChunk()、isString() 以及readAndAppendToByteArray()。

QCborStreamReader::StringResult<QByteArray> QCborStreamReader::readByteArray()

从 CBOR 字符串中解码一个字节数组块并返回。该函数既适用于常规内容,也适用于分块内容,因此调用方必须始终通过循环来调用此函数,即使 `isLengthKnown()` 为真也是如此。该函数的典型用法如下:

QByteArray decodeBytearray(QCborStreamReader &reader)
{
    QByteArray result;
    auto r = reader.readByteArray();
    while (r.status == QCborStreamReader::Ok) {
        result += r.data;
        r = reader.readByteArray();
    }

    if (r.status == QCborStreamReader::Error) {
        // handle error condition
        result.clear();
    }
    return result;
}

readAllByteArray() 函数实现了上述循环以及一些额外的检查。

该函数不执行任何类型转换,包括从整数或字符串的转换。因此,仅当isByteArray()为真时才可调用该函数;在任何其他情况下调用它都将导致错误。

另请参阅 readAllByteArray()、readString()、isByteArray() 和readStringChunk()。

QCborStreamReader::StringResult<QString> QCborStreamReader::readString()

从 CBOR 字符串中解码一个字符串块并返回。该函数既适用于常规字符串内容,也适用于分块的字符串内容,因此调用方必须始终通过循环来调用此函数,即使 `isLengthKnown()` 为真也是如此。该函数的典型用法如下:

QString decodeString(QCborStreamReader &reader)
{
    QString result;
    auto r = reader.readString();
    while (r.status == QCborStreamReader::Ok) {
        result += r.data;
        r = reader.readString();
    }

    if (r.status == QCborStreamReader::Error) {
        // handle error condition
        result.clear();
    }
    return result;
}

readAllString() 函数实现了上述循环以及一些额外的检查。

该函数不执行任何类型转换,包括从整数或字节数组的转换。因此,仅当isString() 返回 true 时才可调用该函数;在任何其他情况下调用它都将导致错误。

另请参阅 readAllString()、readByteArray()、isString() 和readStringChunk()。

QCborStreamReader::StringResult<qsizetype> QCborStreamReader::readStringChunk(char *ptr, qsizetype maxlen)

将当前字符串片段读入由ptr 指向的缓冲区中,该缓冲区的大小为maxlen 。该函数返回一个StringResult 对象,其中复制到ptr 中的字节数保存在\l StringResult::data 成员中。\l StringResult::status 成员指示读取字符串时是否发生错误、数据是否已复制,或是当前片段是否为最后一个。

此函数可用于String 和ByteArray 两种类型。对于后者,此函数将读取与readByteArray() 函数本应返回的数据相同的数据。对于字符串,它返回本应由QString 函数返回的 UTF-8 等效字符串。

该函数通常与currentStringChunkSize() 配合在循环中使用。例如:

QCborStreamReader::StringResult<qsizetype> result;
do {
    qsizetype size = reader.currentStringChunkSize();
    qsizetype oldsize = buffer.size();
    buffer.resize(oldsize + size);
    result = reader.readStringChunk(buffer.data() + oldsize, size);
} while (result.status == QCborStreamReader::Ok);

与readByteArray() 和readString() 不同,该函数不受QByteArray 和QString 的实现限制。

注意:该函数 不会验证 UTF-8 内容是否格式正确。这意味着即使readString() 会引发QCborError::InvalidUtf8String 错误,该函数也不会产生该错误。

另请参阅 currentStringChunkSize()、readString()、readByteArray()、isString() 和isByteArray()。

[since 6.7] QCborStreamReader::StringResult<QByteArray> QCborStreamReader::readUtf8String()

从 CBOR 字符串中解码一个字符串块并返回。该函数既适用于常规字符串内容,也适用于分块字符串内容,因此调用方必须始终通过循环反复调用此函数,即使 `isLengthKnown()` 为真时也是如此。该函数的典型用法如下所示,类似于 `readString()`:

QString decodeString(QCborStreamReader &reader)
{
    QString result;
    auto r = reader.readString();
    while (r.status == QCborStreamReader::Ok) {
        result += r.data;
        r = reader.readString();
    }

    if (r.status == QCborStreamReader::Error) {
        // handle error condition
        result.clear();
    }
    return result;
}

readAllUtf8String() 函数实现了上述循环以及一些额外的检查。

该函数不执行任何类型转换,包括从整数或字节数组进行的转换。因此,仅当isString() 返回 true 时才可调用该函数;在任何其他情况下调用它都将导致错误。

该函数在 Qt 6.7 中引入。

另请参阅 readAllString()、readByteArray()、isString() 以及readStringChunk()。

void QCborStreamReader::reparse()

重新解析当前元素。当源QIODevice 中出现更多数据,且此前因在CBOR流结束前已到达输入数据末尾而解析失败时,必须调用此函数。

从 QByteArray() 读取数据时,addData() 函数会自动调用此函数。若在读取未失败时调用该函数,则无任何效果。

void QCborStreamReader::reset()

将源数据重置回起始位置,并清除解码器状态。如果源数据是QByteArray ,则QCborStreamReader 将从数组的起始位置重新开始。

如果源数据为QIODevice ,则该函数将调用QIODevice::reset(),后者会定位到字节位置0。如果未在设备开头(例如文件开头)找到CBOR流,则该函数很可能产生错误结果。此时,应将QIODevice 定位到正确的偏移量,并调用setDevice()。

另请参阅 clear() 和setDevice()。

void QCborStreamReader::setDevice(QIODevice *device)

将数据源设置为device ,并将解码器重置为初始状态。

另请参阅 device()。

bool QCborStreamReader::toBool() const

返回当前元素的布尔值。

该函数不会进行任何类型转换,包括从整数类型的转换。因此,仅当isTrue()、isFalse() 或isBool() 返回 true 时,才可调用该函数;在任何其他情况下调用它都会引发错误。

另请参见 isBool()、isTrue()、isFalse() 以及toInteger()。

double QCborStreamReader::toDouble() const

返回当前元素的 64 位双精度浮点数值。

该函数不会执行任何类型转换,包括从其他浮点类型或整数值进行的转换。因此,仅当isDouble()为真时才可调用该函数;在任何其他情况下调用它都将引发错误。

另请参阅 isDouble()、toFloat16() 和toFloat()。

qfloat16 QCborStreamReader::toFloat16() const

返回当前元素的 16 位半精度浮点数值。

该函数不进行任何类型转换,包括从其他浮点类型或整数值进行的转换。因此,仅当isFloat16() 为真时才可调用该函数;在任何其他情况下调用它都将引发错误。

另请参阅 isFloat16()、toFloat() 和toDouble()。

float QCborStreamReader::toFloat() const

返回当前元素的 32 位单精度浮点数值。

该函数不执行任何类型转换,包括从其他浮点类型或整数值进行的转换。因此,仅当isFloat()为真时才可调用该函数;在任何其他情况下调用它都将引发错误。

另请参见 isFloat()、toFloat16() 和toDouble()。

qint64 QCborStreamReader::toInteger() const

返回当前元素的整数值,无论该值为负、正还是零。如果该值大于263- 1 或小于-263,返回值将发生溢出且符号不正确。如果需要处理此类值,请改用toUnsignedInteger() 或toNegativeInteger()。

此函数不进行任何类型转换,包括从布尔值或CBOR标签的转换。因此,仅当isInteger()为真时才可调用该函数;在任何其他情况下调用它都将引发错误。

另请参阅 isInteger()、toUnsignedInteger(),以及toNegativeInteger()。

QCborNegativeInteger QCborStreamReader::toNegativeInteger() const

返回当前元素的负整数值。QCborNegativeValue 是一个 64 位无符号整数,包含存储在 CBOR 流中的负数的绝对值。此外,QCborNegativeValue(0) 表示数字-264。

此函数不执行任何类型转换,包括从布尔值或 CBOR 标签的转换。因此,仅当 `isNegativeInteger()` 为真时才可调用该函数;在任何其他情况下调用它都会引发错误。

该函数可用于获取超出 `toInteger()` 返回类型范围的数值。但是,极不建议使用小于-263的负数。

另请参阅 type()、toInteger()、isNegativeInteger() 和isUnsignedInteger()。

QCborSimpleType QCborStreamReader::toSimpleType() const

返回当前简单类型的值。

该函数不会执行任何类型转换,包括从整数类型的转换。因此,仅当isSimpleType() 为真时才可调用该函数;在任何其他情况下调用它都将引发错误。

另请参阅 isSimpleType()、isTrue()、isFalse()、isBool()、isNull() 以及isUndefined()。

QCborTag QCborStreamReader::toTag() const

返回当前元素的标签值。

该函数不会进行任何类型转换,包括从整数类型的转换。因此,仅当isTag() 为真时才可调用该函数;在任何其他情况下调用该函数均会引发错误。

标签是附加在通用 CBOR 类型上的 64 位数字,用于赋予这些类型进一步的含义。有关已知标签的列表,请参阅QCborKnownTags 枚举。

另请参阅 isTag()、toInteger() 以及QCborKnownTags 。

quint64 QCborStreamReader::toUnsignedInteger() const

返回当前元素的无符号整数值。

该函数不执行任何类型转换,包括从布尔值或 CBOR 标记进行的转换。因此,仅当 `isUnsignedInteger()` 为真时才可调用该函数;在任何其他情况下调用它都将引发错误。

该函数可用于获取超出toInteger() 返回类型范围的数值。

另请参阅 type()、toInteger()、isUnsignedInteger() 和isNegativeInteger()。

QCborStreamReader::Type QCborStreamReader::type() const

返回当前元素的类型。该类型为有效类型之一,或为“无效”。

另请参阅 isValid(),isUnsignedInteger(),isNegativeInteger(),isInteger(),isByteArray(),isString(),isArray(),isMap(),isTag(),isSimpleType(),isBool(),isFalse(),isTrue(),isNull(),isUndefined(),isFloat16(),isFloat(), 以及isDouble()。

[delete] QCborStreamReader &QCborStreamReader::operator=(const QCborStreamReader &)

将other 复制并赋值给此QCborStreamReader 实例。该函数已被删除。

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