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 |
- 所有成员(包括继承成员)的列表
- QCborStreamReader 是Qt 中 CBOR 支持的一部分。
注意:该类中的所有函数都是可重入的。
公共类型
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() | |
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 |
详细说明
该类可用于直接从QByteArray 或QIODevice 解码 CBOR 内容流。CBOR 是简明二进制对象表示法(Concise Binary Object Representation),是一种非常紧凑的二进制数据编码形式,与 JSON 兼容。它是由 IETF 受限 RESTful 环境(CoRE)工作组创建的,该工作组已将其用于许多新的 RFC 中。它旨在与CoAP 协议一起使用。
QCborStreamReader 提供了类似于 StAX 的 API,类似于QXmlStreamReader 。使用它需要一些 CBOR 编码方面的知识。有关更简单的 API,请参阅QCborValue ,尤其是解码函数QCborValue::fromCbor() 。
通常情况下,我们通过将源QByteArray 或QIODevice 作为参数传递给构造函数来创建 QCborStreamReader,然后在解码过程中没有错误的情况下从流中弹出元素。有三种 CBOR 类型:
类型 | 类型 | 行为 |
---|---|---|
固定宽度 | 整数、标签、简单类型、浮点型 | 值由 QCborStreamReader 预先解析,因此访问函数是const 。必须调用next() 才能前进。 |
字符串 | 字节数组、文本字符串 | 长度(如果已知)会被预先解析,但字符串本身不会。访问函数不是常量,可能会分配内存。一旦调用,访问函数会自动前进到下一个元素。 |
容器 | 数组、地图 | 长度(如果已知)已预先解析。要访问元素,必须调用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 使用的库已针对任何类型的无效输入进行了广泛测试,并能报告错误。如果检测到任何错误,QCborStreamReader 会将lastError() 设为QCborError::NoError 以外的值,表明检测到的情况。
QCborStreamReader 在正常项目解析过程中检测到的大多数错误都无法恢复。使用 QCborStreamReader 的代码可以选择处理已正确解码的数据,也可以选择丢弃整个数据。
唯一可恢复的错误是QCborError::EndOfFile ,它表示需要更多数据才能完成解析。这种情况适用于从异步源(如管道 (QProcess) 或套接字 (QTcpSocket,QUdpSocket,QNetworkReply 等))读取数据的情况。当有更多数据到达时,如果是从QByteArray 解析数据,则周围的代码需要调用addData() ;如果是直接从 QIDOevice 读取数据,则需要调用reparse() ,因为 QIDOevice 现在有更多数据可用(参见setDevice() )。
另请参阅 QCborStreamWriter,QCborValue,QXmlStreamReader,解析和显示 CBOR 数据、序列化转换器以及保存和加载游戏。
成员类型文档
enum QCborStreamReader::StringResultCode
该枚举由readString() 和readByteArray() 返回,用于指示解析的状态。
常量 | 值 | 说明 |
---|---|---|
QCborStreamReader::EndOfString | 0 | 字符串解析完成,没有错误。 |
QCborStreamReader::Ok | 1 | 函数返回数据;没有错误。 |
QCborStreamReader::Error | -1 | 解析失败,有错误。 |
enum QCborStreamReader::Type
该枚举包含QCborStreamReader 解码的所有可能的 CBOR 类型。CBOR 有 7 种主要类型,另外还有一些不带值的简单类型和浮点数值。
常量 | 值 | 说明 |
---|---|---|
QCborStreamReader::UnsignedInteger | 0x00 | (主要类型 0)范围从 0 到264- 1(18,446,744,073,709,551,616) |
QCborStreamReader::NegativeInteger | 0x20 | (主要类型 1)范围从 -1 到-264(-18,446,744,073,709,551,616) |
QCborStreamReader::ByteArray | ByteString | (主要类型 2)任意二进制数据。 |
QCborStreamReader::ByteString | 0x40 | 是字节数组(ByteArray)的别名。 |
QCborStreamReader::String | TextString | (主要类型 3)Unicode 文本,可能包含 NUL。 |
QCborStreamReader::TextString | 0x60 | 字符串的别名 |
QCborStreamReader::Array | 0x80 | (主要类型 4)异构项数组。 |
QCborStreamReader::Map | 0xa0 | (主要类型 5)异构项的映射/字典。 |
QCborStreamReader::Tag | 0xc0 | (主要类型 6)赋予通用 CBOR 项目更多语义价值的数字。更多信息请参见QCborTag 。 |
QCborStreamReader::SimpleType | 0xe0 | (主要类型 7)无进一步价值的类型。包括布尔型(真和假)、空、未定义。 |
QCborStreamReader::Float16 | HalfFloat | IEEE 754 半精度浮点数 (qfloat16 )。 |
QCborStreamReader::HalfFloat | 0xf9 | Float16 的别名。 |
QCborStreamReader::Float | 0xfa | IEEE 754 单精度浮点 (float )。 |
QCborStreamReader::Double | 0xfb | IEEE 754 双精度浮点 (double )。 |
QCborStreamReader::Invalid | 0xff | 由于解析错误或到达数组或映射的末尾,不是有效类型。 |
成员函数文档
QCborStreamReader::QCborStreamReader()
创建一个没有源数据的 QCborStreamReader 对象。创建后,QCborStreamReader 将报告解析错误。
您可以通过调用addData() 或使用setDevice() 设置不同的源设备来添加更多数据。
[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 被销毁之前,指针必须保持有效。
[noexcept]
QCborStreamReader::~QCborStreamReader()
销毁QCborStreamReader 对象并释放所有相关资源。
void QCborStreamReader::addData(const QByteArray &data)
将data 添加到 CBOR 数据流并重新解析当前元素。如果之前在处理数据流时数据已经结束,但现在有更多数据可用,则此函数非常有用。
void QCborStreamReader::addData(const char *data, qsizetype len)
这是一个重载函数。
从data 开始向 CBOR 流添加len 字节的数据,并重新解析当前元素。如果之前在处理数据流时数据已经结束,但现在有更多数据可用,则此函数非常有用。
void QCborStreamReader::addData(const quint8 *data, qsizetype len)
这是一个重载函数。
从data 开始向 CBOR 流添加len 字节的数据,并重新解析当前元素。如果之前在处理数据流时数据已经结束,但现在有更多数据可用,则此函数非常有用。
void QCborStreamReader::clear()
清除解码器状态,并将输入源数据重置为空字节数组。调用此函数后,QCborStreamReader 将显示解析错误。
调用addData() 添加更多需要解析的数据。
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。如果我们正在解析根元素,返回 false 的 hasNext() 表示解析已完成;否则,如果容器深度非零,则外部代码需要调用leaveContainer()。
另请参见 parentContainerType()、containerDepth() 和leaveContainer()。
bool QCborStreamReader::isArray() const
如果当前元素的类型是数组,则返回 true(也就是说,如果type() 返回QCborStreamReader::Array )。如果该函数返回 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(); }
注意: 上面的代码并不验证长度是否为合理值。如果输入流报告长度为 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
如果当前元素的类型是字节数组,则返回 true(即type() 返回QCborStreamReader::ByteArray )。如果该函数返回 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 类型,必须由应用程序处理。
[noexcept]
bool QCborStreamReader::isLengthKnown() const
如果已知当前数组、映射、字节数组或字符串的长度(在 CBOR 流中显式),则返回 true,否则返回 false。只有当元素是其中之一时,才应调用此函数。
如果长度已知,可以通过调用length() 获得。
如果不知道映射或数组的长度,则长度由数据流中的元素数暗示。QCborStreamReader 没有在这种情况下计算长度的 API。
字符串和字节数组的长度也可能不确定(也就是说,它们可能以多块形式传输)。目前QCborStreamWriter 无法创建这些字符串和字节数组,但其他编码器可以,因此QCborStreamReader 支持这些字符串和字节数组。
另请参见 length()、QCborStreamWriter::startArray() 和QCborStreamWriter::startMap()。
bool QCborStreamReader::isMap() const
如果当前元素的类型是 map,则返回 true(也就是说,如果type() 返回QCborStreamReader::Map )。如果该函数返回 true,则可以调用enterContainer() 开始解析该容器。
当当前元素是一个映射时,还可以调用isLengthKnown() 查找 CBOR 流中映射的大小是否明确。如果是,则可以通过调用length() 获得该大小。
下面的示例根据映射的大小预先分配了一个QVariantMap ,以提高解码效率:
QVariantMap populateFromCbor(QCborStreamReader &reader) { QVariantMap map; if (reader.isLengthKnown()) map.reserve(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(); }
上面的示例使用名为readElementAsString
的函数读取映射的键值并获得字符串。这是因为 CBOR 映射可以包含任何类型的键,而不仅仅是字符串。用户代码需要执行这种转换,拒绝非字符串键,或者使用QVariantMap 和QVariantHash 以外的其他容器。例如,如果预计映射包含整数键(建议使用整数键,因为它可以减少数据流大小和解析过程),那么正确的容器应该是\l{QMap}<int, QVariant>
或\l{QHash}<int, QVariant>
。
注意: 上述代码不会验证长度是否为合理值。如果输入流报告长度为 10 亿个元素,上述函数将尝试分配大约 24 GB 或更多的 RAM,这可能导致崩溃。
另请参见 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。空值可用于表示不存在某些可选数据。
注意: 该函数与isValid() 并不相反。空值是一个有效的 CBOR 值。
另请参阅 type()、isSimpleType() 和toSimpleType()。
bool QCborStreamReader::isSimpleType() const
如果当前元素的类型是任何 CBOR 简单类型,包括布尔值(true 和 false)以及空值和未定义值,则返回 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
如果当前元素的类型是文本字符串,则返回 true(即type() 返回QCborStreamReader::String )。如果该函数返回 true,则可以调用readString() 读取该数据。
另请参阅 type()、readString() 和isByteArray()。
bool QCborStreamReader::isTag() const
如果当前元素的类型是 CBOR 标记,则返回 true(即type() 返回QCborStreamReader::Tag )。如果该函数返回 true,则可以调用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 类型,必须由应用程序处理。
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() 为 true 时才能调用该函数;在任何其他条件下调用该函数都是错误的。
注意: 此函数不能恢复执行。也就是说,在仍可接收 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() 为 true,调用者也必须始终循环调用该函数。该函数的典型用法如下:
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() 为 true 时才能调用该函数;在任何其他条件下调用该函数都是错误的。
另请参见 readAllByteArray()、readString()、isByteArray() 和readStringChunk()。
QCborStreamReader::StringResult<QString> QCborStreamReader::readString()
从 CBOR 字符串中解码一个字符串块并返回。该函数既可用于常规字符串内容,也可用于分块字符串内容,因此即使isLengthKnown() 为 true,调用者也必须始终循环调用该函数。该函数的典型用法如下:
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<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() 为 true,调用者也必须始终循环调用该函数。该函数的典型用法与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()
重新解析当前元素。由于在 CBOR 数据流结束前输入数据已经结束,导致解析失败,当源QIODevice 中出现更多可用数据时,必须调用此函数。
从 QByteArray() 读取数据时,addData() 函数会自动调用该函数。在读取未失败时调用该函数是无效的。
void QCborStreamReader::reset()
将数据源重置回起始位置,并清除解码器状态。如果源数据是QByteArray ,QCborStreamReader 将从数组的起始位置重新开始。
如果源数据是QIODevice ,则该函数将调用QIODevice::reset() ,该函数将寻址到字节位置 0。如果 CBOR 流没有在设备的开头(如文件的开头)找到,则该函数可能会做错。相反,应将QIODevice 定位到正确的偏移位置,然后调用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() 为 true 时才能调用该函数;在任何其他条件下调用该函数都是错误的。
另请参阅 isDouble()、toFloat16() 和toFloat()。
qfloat16 QCborStreamReader::toFloat16() const
返回当前元素的 16 位半精度浮点数值。
该函数不执行任何类型转换,包括从其他浮点类型或整数值的类型转换。因此,只有在isFloat16() 为 true 时才能调用该函数;在任何其他条件下调用该函数都是错误的。
另请参阅 isFloat16()、toFloat() 和toDouble()。
float QCborStreamReader::toFloat() const
返回当前元素的 32 位单精度浮点数值。
该函数不执行任何类型转换,包括从其他浮点类型或整数值的类型转换。因此,只有在isFloat() 为 true 时才能调用该函数;在任何其他条件下调用该函数都会出错。
另请参阅 isFloat()、toFloat16() 和toDouble()。
qint64 QCborStreamReader::toInteger() const
返回当前元素的整数值,无论是负值、正值还是零值。如果数值大于263- 1 或小于-263,返回值将溢出,且符号不正确。如果需要处理这些值,请使用toUnsignedInteger() 或toNegativeInteger() 代替。
该函数不执行任何类型转换,包括布尔或 CBOR 标记的类型转换。因此,只有在isInteger() 为 true 时才能调用该函数;在任何其他条件下调用该函数都是错误的。
另请参阅 isInteger()、toUnsignedInteger() 和toNegativeInteger()。
QCborNegativeInteger QCborStreamReader::toNegativeInteger() const
返回当前元素的负整数值。QCborNegativeValue 是一个 64 位无符号整数,包含 CBOR 流中存储的负数的绝对值。此外,QCborNegativeValue(0) 表示数字 -264。
该函数不执行任何类型转换,包括布尔或 CBOR 标记的类型转换。因此,只有在isNegativeInteger() 为 true 的情况下才能调用该函数;在任何其他条件下调用该函数都是错误的。
该函数可用于获取超出toInteger() 返回类型范围的数字。但是,不鼓励使用小于-263的负数。
另请参阅 type()、toInteger()、isNegativeInteger() 和isUnsignedInteger()。
QCborSimpleType QCborStreamReader::toSimpleType() const
返回当前简单类型的值。
该函数不执行任何类型转换,包括整型转换。因此,只有在isSimpleType() 为 true 时才能调用该函数;在任何其他条件下调用该函数都是错误的。
另请参阅 isSimpleType()、isTrue()、isFalse()、isBool()、isNull() 和isUndefined()。
QCborTag QCborStreamReader::toTag() const
返回当前元素的标记值。
该函数不执行任何类型转换,包括整数类型转换。因此,只有在isTag() 为 true 时才能调用该函数;在任何其他条件下调用该函数都是错误的。
标记是附加在通用 CBOR 类型上的 64 位数字,赋予这些类型更多意义。有关已知标记的列表,请参阅QCborKnownTags 枚举。
另请参阅 isTag(),toInteger() 和QCborKnownTags 。
quint64 QCborStreamReader::toUnsignedInteger() const
返回当前元素的无符号整数值。
该函数不执行任何类型转换,包括布尔或 CBOR 标记的类型转换。因此,只有当isUnsignedInteger() 为 true 时才能调用该函数;在任何其他条件下调用该函数都是错误的。
该函数可用于获取超出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() 。
© 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.