QCborStreamReader 类

QCborStreamReader 类是一个简单的 CBOR 流解码器,可以在 QByteArrayQIODevice 上操作。 更多...

头文件 #include <QCborStreamReader>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core

注意:该类中所有函数都是 可重入的

公共类型

结构体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()
voidaddData(const QByteArray &data)
voidaddData(const char *data, qsizetype len)
voidaddData(const quint8 *data, qsizetype len)
voidclear()
intcontainerDepth() const
qint64currentOffset() const
qsizetypecurrentStringChunkSize() const
QIODevice *device() const
boolenterContainer()
boolhasNext() const
boolisArray() const
boolisBool() const
boolisByteArray() const
boolisContainer() const
boolisDouble() const
boolisFalse() const
boolisFloat16() const
boolisFloat() const
boolisInteger() const
boolisInvalid() const
boolisLengthKnown() const
boolisMap() const
boolisNegativeInteger() const
boolisNull() const
boolisSimpleType() const
boolisSimpleType(QCborSimpleType st) const
boolisString() const
boolisTag() const
boolisTrue() const
boolisUndefined() const
boolisUnsignedInteger() const
boolisValid() const
QCborErrorlastError() const
boolleaveContainer()
quint64length() const
boolnext(int maxRecursion = 10000)
QCborStreamReader::TypeparentContainerType() const
(since 6.7) QByteArrayreadAllByteArray()
(since 6.7) QStringreadAllString()
(since 6.7) QByteArrayreadAllUtf8String()
(since 6.7) boolreadAndAppendToByteArray(QByteArray &dst)
(since 6.7) boolreadAndAppendToString(QString &dst)
(since 6.7) boolreadAndAppendToUtf8String(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()
voidreparse()
voidreset()
voidsetDevice(QIODevice *device)
booltoBool() const
doubletoDouble() const
qfloat16toFloat16() const
floattoFloat() const
qint64toInteger() const
QCborNegativeIntegertoNegativeInteger() const
QCborSimpleTypetoSimpleType() const
QCborTagtoTag() const
quint64toUnsignedInteger() const
QCborStreamReader::Typetype() const

详细描述

此类可用于直接从QByteArrayQIODevice解码CBOR内容流。CBOR是紧凑的二元对象表示形式,是一种与JSON兼容的二进制数据编码形式,由IETF约束RESTful环境(CoRE)工作组创建,该工作组在许多新的RFC中使用了它。它打算与CoAP协议一起使用。

QCborStreamReader提供一个类似StAX的API,类似于QXmlStreamReader。使用它需要一些CBOR编码的知识。对于更简单的API,请参阅QCborValue以及特别是解码函数QCborValue::fromCbor

通常,通过将源QByteArrayQIODevice作为参数传递给构造函数来创建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直接读取)。

另请参阅QCborStreamWriterQCborValueQXmlStreamReader解析和显示CBOR数据序列化转换器保存和加载游戏

成员类型文档

枚举QCborStreamReader::StringResultCode

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

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

枚举 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::ByteString0x40是 ByteArray 的别名。
QCborStreamReader::StringTextString(主类型 3) 包含 NUL 的 Unicode 文本。
QCborStreamReader::TextString0x60是 String 的别名
QCborStreamReader::Array0x80(主类型 4) 不相同项的数组。
QCborStreamReader::Map0xa0(主类型 5) 非相同项的映射/字典。
QCborStreamReader::Tag0xc0(主类型 6) 给出进一步语义值给通用 CBOR 项的数字。有关更多信息,请参见 QCborTag
QCborStreamReader::SimpleType0xe0(主类型 7) 不带进一步值的类型。包括布尔值(真和假)、null、undefined。
QCborStreamReader::Float16HalfFloatIEEE 754 半精度浮点数 (qfloat16)。
QCborStreamReader::HalfFloat0xf9是 Float16 的别名。
QCborStreamReader::Float0xfaIEEE 754 单精度浮点数 (float)。
QCborStreamReader::Double0xfbIEEE 754 双精度浮点数 (double)。
QCborStreamReader::Invalid0xff不是一个有效类型,可能是因为解析错误或由于达到数组或映射的末尾。

成员函数文档

QCborStreamReader::QCborStreamReader()

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

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

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

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()以添加更多要解析的数据。

另请参阅 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();
   }

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

另请参阅 type()、isMap()、isLengthKnown()、length()、enterContainer()和leaveContainer()。

bool QCborStreamReader::isBool() const

如果当前元素是布尔值(truefalse),则返回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(),isFloat16isDouble

bool QCborStreamReader::isInteger() const

如果当前元素类型是无符号整数或负数(即 type() 返回 QCborStreamReader::UnsignedIntegerQCborStreamReader::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.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映射可能包含任何类型的键,而不仅仅是字符串。用户代码需要执行此转换、拒绝非字符串键,或者使用除了QVariantMapQVariantHash之外的容器。例如,如果预期映射包含整数键(推荐这样做,因为它可以减少流的大小和解析),那么正确的容器是\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种可能性,但目前只有四种具有定义意义的值。代码不需要处理未知简单类型,如果发现未知类型,它可能会简单地忽略流,将其视为无效。

另请参阅QCborSimpleTypetype()、isSimpleType(QCborSimpleType)和toSimpleType()。

bool QCborStreamReader::isSimpleType(QCborSimpleType st) const

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

CBOR简单类型是不携带额外值的类型。有255种可能性,但目前只有四种具有定义意义的值。代码不需要处理未知简单类型,如果发现未知类型,它可能会简单地忽略流,将其视为无效。

另请参阅QCborSimpleTypetype()、isSimpleTypetoSimpleType

bool QCborStreamReader::isString() const

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

另请参阅typereadStringisByteArray

bool QCborStreamReader::isTag() const

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

另请参阅type() 和 toTag

bool QCborStreamReader::isTrue() const

如果当前元素是 true 值,则返回 true,否则返回 false。

另请参阅typeisFalseisBooltoBoolisSimpleTypetoSimpleType

bool QCborStreamReader::isUndefined() const

如果当前元素是 undefined 值,则返回 true,否则返回 false。未定义值可以编码为表示某些转换失败或无法在创建流时进行编码。QCborStreamReader 从不进行任何替换,此函数只有在流中存在明确的未定义值时才会返回 true。

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

bool QCborStreamReader::isUnsignedInteger() const

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

另请参阅typetoUnsignedIntegertoIntegerisIntegerisNegativeInteger

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::ArrayQCborStreamReader::Map,指示包含当前项的容器是数组还是映射。如果我们目前正在解析根元素,则此函数返回 QCborStreamReader::Invalid

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

[自6.7版本以来] QByteArray QCborStreamReader::readAllByteArray()

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

此函数不执行任何类型转换,包括整数或字符串。因此,仅在isByteArray()为true时才能调用此函数;在任何其他条件下调用它将是一个错误。

注意:该函数不能恢复。也就是说,在CBOR数据可能仍然接收的上下文中不应使用此函数,例如从套接字或管道。当全部数据已接收到并在输入QByteArrayQIODevice中可用时才应使用此函数。

此函数是在Qt 6.7中引入的。

另请参阅:readByteArray(),readStringChunk(),isByteArray()和readAllString}。

[自6.7版本以来] QString QCborStreamReader::readAllString()

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

此函数不执行任何类型转换,包括从整数或字节数组。因此,仅在isString()返回true时才能调用此函数;在任何其他条件下调用它将是一个错误。

注意:该函数不能恢复。也就是说,在CBOR数据可能仍然接收的上下文中不应使用此函数,例如从套接字或管道。当全部数据已接收到并在输入QByteArrayQIODevice中可用时才应使用此函数。

此函数是在Qt 6.7中引入的。

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

[自6.7版本以来] QByteArray QCborStreamReader::readAllUtf8String()

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

此函数不执行任何类型转换,包括从整数或字节数组。因此,仅在isString()返回true时才能调用此函数;在任何其他条件下调用它将是一个错误。

注意:该函数不能恢复。也就是说,在CBOR数据可能仍然接收的上下文中不应使用此函数,例如从套接字或管道。当全部数据已接收到并在输入QByteArrayQIODevice中可用时才应使用此函数。

此函数是在Qt 6.7中引入的。

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

[自6.7版本以来] bool QCborStreamReader::readAndAppendToByteArray(QByteArray &dst)

解码当前字节字符串并将其追加到dst中。如果字符串分块,此函数将遍历所有块并将它们连接起来。如果解码过程中发生错误,尽管可以成功解码的其它块可能已经写入dst,但仍然返回true表示解码没有错误,否则返回false

此函数不执行任何类型转换,包括整数或字符串。因此,仅在isByteArray()为true时才能调用此函数;在任何其他条件下调用它将是一个错误。

注意:该函数不能恢复。也就是说,在CBOR数据可能仍然接收的上下文中不应使用此函数,例如从套接字或管道。当全部数据已接收到并在输入QByteArrayQIODevice中可用时才应使用此函数。

此函数是在Qt 6.7中引入的。

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

[自6.7版本以来] bool QCborStreamReader::readAndAppendToString(QString &dst)

解码当前的文本字符串并将其追加到dst中。如果字符串被分块,此函数将迭代所有块并将它们连接起来。如果在解码过程中发生错误,可能还会有其他块被成功解码并被写入dst。如果没有错误发生,返回true,否则返回false

此函数不执行任何类型转换,包括从整数或字节数组。因此,仅在isString()返回true时才能调用此函数;在任何其他条件下调用它将是一个错误。

注意:该函数不能恢复。也就是说,在CBOR数据可能仍然接收的上下文中不应使用此函数,例如从套接字或管道。当全部数据已接收到并在输入QByteArrayQIODevice中可用时才应使用此函数。

此函数是在Qt 6.7中引入的。

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

[自 6.7 版起] bool QCborStreamReader::readAndAppendToUtf8String(QByteArray &dst)

解码当前的文本字符串并将其追加到dst中。如果字符串被分块,此函数将迭代所有块并将它们连接起来。如果在解码过程中发生错误,可能还会有其他块被成功解码并被写入dst。如果没有错误发生,返回true,否则返回false

此函数不执行任何类型转换,包括从整数或字节数组。因此,仅在isString()返回true时才能调用此函数;在任何其他条件下调用它将是一个错误。

注意:该函数不能恢复。也就是说,在CBOR数据可能仍然接收的上下文中不应使用此函数,例如从套接字或管道。当全部数据已接收到并在输入QByteArrayQIODevice中可用时才应使用此函数。

此函数是在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() 不同,此函数不受 QByteArrayQString 实现限制。

注意:此函数不执行验证 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()

将源重置到开头并清除解码器状态。如果是 QByteArrayQCborStreamReader将从数组的开头重新开始。

如果是 QIODevice,此函数将调用 QIODevice::reset(),这将定位到字节位置 0。如果 CBOR 流不在设备的开头(例如,文件的开头),则此函数可能会出错。相反,将 QIODevice 定位到正确的偏移量并调用 setDevice()。

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

void QCborStreamReader::setDevice(QIODevice *device)

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

另请参阅:device()。

bool QCborStreamReader::toBool() const

返回当前元素的布尔值。

此函数不执行任何类型转换,包括从整数转换。因此,只有在isTrue(),isFalse() 或 isBool() 返回 true 时才可调用;在其他任何条件下调用它是错误。

另请参阅 isBoolisTrueisFalsetoInteger

double QCborStreamReader::toDouble() const

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

此函数不执行任何类型转换,包括从其他浮点类型或从整数值。因此,只有在 isDouble 返回 true 时才可调用;在其他任何条件下调用它是错误。

另请参阅 isDoubletoFloat16toFloat

qfloat16 QCborStreamReader::toFloat16() const

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

此函数不执行任何类型转换,包括从其他浮点类型或从整数值。因此,只有在 isFloat16 返回 true 时才可调用;在其他任何条件下调用它是错误。

另请参阅 isFloat16toFloattoDouble

float QCborStreamReader::toFloat() const

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

此函数不执行任何类型转换,包括从其他浮点类型或从整数值。因此,只有在 isFloat 返回 true 时才可调用;在其他任何条件下调用它是错误。

另请参阅 isFloattoFloat16toDouble

qint64 QCborStreamReader::toInteger() const

返回当前元素的整数值,无论它是负数、正数还是零。如果值大于 263 - 1 或小于 -263,则返回值将溢出并将具有错误的符号。如果需要处理这些值,请改用 toUnsignedInteger() 或 toNegativeInteger()。

此函数不执行任何类型转换,包括从布尔值或 CBOR 标签。因此,只有在 isInteger 返回 true 时才可调用;在其他任何条件下调用它是错误。

另请参阅 isIntegertoUnsignedIntegertoNegativeInteger

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. 的商标。所有其他商标均为其各自所有者的财产。