QCborStreamReader 类
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 的组成部分。Qt 中对 CBOR 的支持.
注意:该类中所有函数都是 可重入的。
公共类型
结构体 | StringResult |
枚举 | StringResultCode { EndOfString, Ok, Error } |
枚举 | Type { UnsignedInteger, NegativeInteger, ByteArray, ByteString, String, …, Invalid } |
公共函数
QCborStreamReader() | |
QCborStreamReader(const char *data, qsizetype len) | |
QCborStreamReader(const quint8 *data, qsizetype len) | |
QCborStreamReader(const QByteArray &data) | |
QCborStreamReader(QIODevice *device) | |
~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是紧凑的二元对象表示形式,是一种与JSON兼容的二进制数据编码形式,由IETF约束RESTful环境(CoRE)工作组创建,该工作组在许多新的RFC中使用了它。它打算与CoAP协议一起使用。
QCborStreamReader提供一个类似StAX的API,类似于QXmlStreamReader。使用它需要一些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,这表示为了完成解析还需要更多的数据。当从异步源(如管道或套接字)读取数据时,这种情况下很有用。当更多数据到达时,周围的代码需要调用addData()(如果是从QByteArray解析)或reparse()(如果它是从现在有更多数据的QIODevice直接读取)。
另请参阅QCborStreamWriter、QCborValue、QXmlStreamReader、解析和显示CBOR数据、序列化转换器和保存和加载游戏。
成员类型文档
枚举QCborStreamReader::StringResultCode
此枚举由readString()和readByteArray()返回,并用于指示解析的状态。
常量 | 值 | 描述 |
---|---|---|
QCborStreamReader::EndOfString | 0 | 字符串的解析已完成,没有错误。 |
QCborStreamReader::Ok | 1 | 函数返回数据;没有错误。 |
QCborStreamReader::Error | -1 | 解析失败,出现错误。 |
枚举 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) 包含 NUL 的 Unicode 文本。 |
QCborStreamReader::TextString | 0x60 | 是 String 的别名 |
QCborStreamReader::Array | 0x80 | (主类型 4) 不相同项的数组。 |
QCborStreamReader::Map | 0xa0 | (主类型 5) 非相同项的映射/字典。 |
QCborStreamReader::Tag | 0xc0 | (主类型 6) 给出进一步语义值给通用 CBOR 项的数字。有关更多信息,请参见 QCborTag。 |
QCborStreamReader::SimpleType | 0xe0 | (主类型 7) 不带进一步值的类型。包括布尔值(真和假)、null、undefined。 |
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() 设置不同的源设备来添加更多数据。
QCborStreamReader::QCborStreamReader(const char *data, qsizetype len)
这是一个重载函数。
使用从data开始的 len 字节数据创建一个 QCborStreamReader 对象。指针必须在 QCborStreamReader 销毁之前保持有效。
QCborStreamReader::QCborStreamReader(const quint8 *data, qsizetype len)
这是一个重载函数。
使用从data开始的 len 字节数据创建一个 QCborStreamReader 对象。指针必须在 QCborStreamReader 销毁之前保持有效。
[显式]
QCborStreamReader::QCborStreamReader(const QByteArray &data)
这是一个重载函数。
创建一个解析 data 中找到的 CBOR 流的 QCborStreamReader 对象。
[显式]
QCborStreamReader::QCborStreamReader(QIODevice *device)
这是一个重载函数。
创建一个将解析device中找到的 CBOR 流的 QCborStreamReader 对象。QCborStreamReader 不持有 device,因此它必须在对象销毁之前保持有效。
[noexcept]
QCborStreamReader::~QCborStreamReader()
销毁此 QCborStreamReader 对象并释放任何相关资源。
void QCborStreamReader::addData(const QByteArray &数据)
将数据添加到CBOR流并重新解析当前元素。此函数在处理流时之前已达到数据末尾,但现在有更多数据可用时很有用。
void QCborStreamReader::addData(const char *数据, qsizetype 长度)
这是一个重载函数。
将长度个字节的数据从数据的起始位置添加到CBOR流并重新解析当前元素。此函数在处理流时之前已达到数据末尾,但现在有更多数据可用时很有用。
void QCborStreamReader::addData(const quint8 *数据, qsizetype 长度)
这是一个重载函数。
将长度个字节的数据从数据的起始位置添加到CBOR流并重新解析当前元素。此函数在处理流时之前已达到数据末尾,但现在有更多数据可用时很有用。
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。如果我们正在解析根元素,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(); }
注意: 上述代码没有验证长度是否为合理值。如果输入流报告长度为10亿个元素,那么上述函数将尝试分配大约16 GB或更多的RAM,这可能导致崩溃。
另请参阅 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中的正常类型,必须由应用程序处理。
[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.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,这可能导致崩溃。
另请参阅类型()、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)、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() 读取数据。
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()。
[自6.7版本以来]
QByteArray QCborStreamReader::readAllByteArray()
解码当前字节字符串并返回它。如果字符串被分块,此函数将遍历所有块并将它们连接起来。如果发生错误,此函数将返回一个默认构造的QByteArray(),但这可能与某些空字节字符串无法区分。相反,请检查lastError()以确定是否发生错误。
此函数不执行任何类型转换,包括整数或字符串。因此,仅在isByteArray()为true时才能调用此函数;在任何其他条件下调用它将是一个错误。
注意:该函数不能恢复。也就是说,在CBOR数据可能仍然接收的上下文中不应使用此函数,例如从套接字或管道。当全部数据已接收到并在输入QByteArray或QIODevice中可用时才应使用此函数。
此函数是在Qt 6.7中引入的。
另请参阅:readByteArray(),readStringChunk(),isByteArray()和readAllString}。
[自6.7版本以来]
QString QCborStreamReader::readAllString()
解码当前文本字符串并返回它。如果字符串被分块,此函数将遍历所有块并将它们连接起来。如果发生错误,此函数将返回一个默认构造的QString(),但这可能与某些空文本字符串无法区分。相反,请检查lastError()以确定是否发生错误。
此函数不执行任何类型转换,包括从整数或字节数组。因此,仅在isString()返回true时才能调用此函数;在任何其他条件下调用它将是一个错误。
注意:该函数不能恢复。也就是说,在CBOR数据可能仍然接收的上下文中不应使用此函数,例如从套接字或管道。当全部数据已接收到并在输入QByteArray或QIODevice中可用时才应使用此函数。
此函数是在Qt 6.7中引入的。
另请参阅:readString(),readStringChunk(),isString()和readAllByteArray()。
[自6.7版本以来]
QByteArray QCborStreamReader::readAllUtf8String()
解码当前文本字符串并返回它。如果字符串被分块,此函数将遍历所有块并将它们连接起来。如果发生错误,此函数将返回一个默认构造的QString(),但这可能与某些空文本字符串无法区分。相反,请检查lastError()以确定是否发生错误。
此函数不执行任何类型转换,包括从整数或字节数组。因此,仅在isString()返回true时才能调用此函数;在任何其他条件下调用它将是一个错误。
注意:该函数不能恢复。也就是说,在CBOR数据可能仍然接收的上下文中不应使用此函数,例如从套接字或管道。当全部数据已接收到并在输入QByteArray或QIODevice中可用时才应使用此函数。
此函数是在Qt 6.7中引入的。
另请参阅:readString(),readStringChunk(),isString()和readAllByteArray()。
[自6.7版本以来]
bool QCborStreamReader::readAndAppendToByteArray(QByteArray &dst)
解码当前字节字符串并将其追加到dst中。如果字符串分块,此函数将遍历所有块并将它们连接起来。如果解码过程中发生错误,尽管可以成功解码的其它块可能已经写入dst,但仍然返回true
表示解码没有错误,否则返回false
。
此函数不执行任何类型转换,包括整数或字符串。因此,仅在isByteArray()为true时才能调用此函数;在任何其他条件下调用它将是一个错误。
注意:该函数不能恢复。也就是说,在CBOR数据可能仍然接收的上下文中不应使用此函数,例如从套接字或管道。当全部数据已接收到并在输入QByteArray或QIODevice中可用时才应使用此函数。
此函数是在Qt 6.7中引入的。
另请参阅:readByteArray(),readStringChunk(),isByteArray()和readAndAppendToString()。
[自6.7版本以来]
bool QCborStreamReader::readAndAppendToString(QString &dst)
解码当前的文本字符串并将其追加到dst中。如果字符串被分块,此函数将迭代所有块并将它们连接起来。如果在解码过程中发生错误,可能还会有其他块被成功解码并被写入dst。如果没有错误发生,返回true
,否则返回false
。
此函数不执行任何类型转换,包括从整数或字节数组。因此,仅在isString()返回true时才能调用此函数;在任何其他条件下调用它将是一个错误。
注意:该函数不能恢复。也就是说,在CBOR数据可能仍然接收的上下文中不应使用此函数,例如从套接字或管道。当全部数据已接收到并在输入QByteArray或QIODevice中可用时才应使用此函数。
此函数是在Qt 6.7中引入的。
另请参阅readString(),readStringChunk(),isString()和readAndAppendToByteArray()。
[自 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()为true时才能调用此函数;在任何其他条件下调用它将是一个错误。
另请参阅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成员中。《code translate="no">\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() 为真也是如此。此函数的典型用途类似于下述 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()为真时才能调用该函数;在其他任何条件下调用都是错误。
此函数可用于获取超出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
返回当前元素的类型。它可以是有效类型之一或Invalid。
另请参阅 isValid(),isUnsignedInteger(),isNegativeInteger(),isInteger(),isByteArray(),isString(),isArray(),isMap(),isTag(),isSimpleType(),isBool(),isFalse(),isTrue(),isNull(),isUndefined(),isFloat16(),isFloat() 和 isDouble。
© 2024 The Qt Company Ltd. 本文档中所包含的贡献版权属于各自的拥有者。本提供的文档是根据由自由软件基金会发布并遵守的 GNU自由文档许可版本1.3 使用的。Qt 和相关的标志是芬兰和/或其他国家/地区的 The Qt Company Ltd. 的商标。所有其他商标均为其各自所有者的财产。