QCborValue类

QCborValue类封装了CBOR中的值。 更多信息...

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

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

公开类型

枚举DiagnosticNotationOption { 紧凑型, 换行, 扩展格式 }
标志DiagnosticNotationOptions
枚举EncodingOption { 不转换, 使用浮点数, 使用浮点16位, 使用整数 }
标志EncodingOptions
枚举Type { 整数, 字节数组, 字符串, 数组, 映射, …, Uuid }

公开函数

QCborValue()
QCborValue(QCborValue::Type t_)
QCborValue(std::nullptr_t)
QCborValue(bool b)
QCborValue(qint64 i)
QCborValue(double d)
QCborValue(QCborSimpleType st)
QCborValue(const QByteArray &ba)
QCborValue(const QString &s)
QCborValue(QStringView s)
QCborValue(QLatin1StringView s)
QCborValue(const QCborArray &a)
QCborValue(QCborArray &&a)
QCborValue(const QCborMap &m)
QCborValue(QCborMap &&m)
QCborValue(QCborTag tag, const QCborValue &tv = QCborValue())
QCborValue(QCborKnownTags tag, const QCborValue &tv = QCborValue())
QCborValue(const QDateTime &dt)
QCborValue(const QUrl &url)
QCborValue(const QRegularExpression &rx)
QCborValue(const QUuid &uuid)
QCborValue(const QCborValue &other)
QCborValue(QCborValue &&other)
~QCborValue()
intcompare(const QCborValue &other) const
boolisArray() const
boolisBool() const
boolisByteArray() const
boolisContainer() const
boolisDateTime() const
boolisDouble() const
boolisFalse() const
boolisInteger() const
boolisInvalid() const
boolisMap() const
boolisNull() const
boolisRegularExpression() const
boolisSimpleType() const
boolisSimpleType(QCborSimpleType st) const
boolisString() const
boolisTag() const
boolisTrue() const
boolisUndefined() const
boolisUrl() const
boolisUuid() const
voidswap(QCborValue &other)
QCborTagtag(QCborTag defaultValue = QCborTag(-1)) const
QCborValuetaggedValue(const QCborValue &defaultValue = QCborValue()) const
QCborArraytoArray() const
QCborArraytoArray(const QCborArray &defaultValue) const
booltoBool(bool defaultValue = false) const
QByteArraytoByteArray(const QByteArray &defaultValue = {}) const
QByteArraytoCbor(QCborValue::EncodingOptions opt = NoTransformation) const
voidtoCbor(QCborStreamWriter &writer, QCborValue::EncodingOptions opt = NoTransformation) const
QDateTimetoDateTime(const QDateTime &defaultValue = {}) const
QStringtoDiagnosticNotation(QCborValue::DiagnosticNotationOptions opts = Compact) const
doubletoDouble(double defaultValue = 0) const
qint64toInteger(qint64 defaultValue = 0) const
QJsonValuetoJsonValue() const
QCborMaptoMap() const
QCborMaptoMap(const QCborMap &defaultValue) const
QRegularExpressiontoRegularExpression(const QRegularExpression &defaultValue = {}) const
QCborSimpleTypetoSimpleType(QCborSimpleType defaultValue = QCborSimpleType::Undefined) const
QStringtoString(const QString &defaultValue = {}) const
QUrltoUrl(const QUrl &defaultValue = {}) const
QUuidtoUuid(const QUuid &defaultValue = {}) const
QVarianttoVariant() const
QCborValue::Typetype() const
booloperator!=(const QCborValue &other) const
booloperator<(const QCborValue &other) const
QCborValue &operator=(const QCborValue &other)
QCborValue &operator=(QCborValue &&other)
booloperator==(const QCborValue &other) const
const QCborValueoperator[](const QString &key) const
const QCborValueoperator[](QLatin1StringView key) const
const QCborValueoperator[](qint64 key) const
QCborValueRefoperator[](qint64 key)
QCborValueRefoperator[](QLatin1StringView key)
QCborValueRefoperator[](const QString &key)

静态公有成员

QCborValuefromCbor(QCborStreamReader &reader)
QCborValuefromCbor(const QByteArray &ba, QCborParserError *error = nullptr)
QCborValuefromCbor(const char *data, qsizetype len, QCborParserError *error = nullptr)
QCborValuefromCbor(const quint8 *data, qsizetype len, QCborParserError *error = nullptr)
QCborValuefromJsonValue(const QJsonValue &v)
QCborValuefromVariant(const QVariant &variant)

详细描述

此类可用于存储CBOR中可用的许多类型之一。CBOR是紧凑的二进制对象表示法,是一种非常紧凑的二进制数据编码形式,是JSON的超集。它由IETF约束RESTful环境(CoRE)工作组创建,该工作组在许多新的RFC中使用了它。它打算与CoAP协议一起使用。

CBOR包含三组内置类型

  • 基本类型:整数、浮点数(双精度)、布尔值、null等。
  • 类似于字符串的类型:字符串和字节数组
  • 容器:数组和映射

此外,CBOR通过将“标签”关联到上述类型之一来支持类型扩展形式。例如,UUID通过标签和包含UUID内容的16字节字节数组表示。QCborValue支持通过Qt类(如QUuid)直接创建和解码这些扩展类型。

有关完整列表,请参阅QCborValue::Type。使用type()或“isXxxx”函数之一可以查询QCborValue的类型。

扩展类型和标记值

标记值是与一个数字配对的常规QCborValue,该数字是其标签。有关API中使用的标签以及完整、正式列表的更多信息,请参阅QCborKnownTags。这些组合形成了扩展类型。

QCborValue在API中支持某些扩展类型,如URL(使用QUrl)和UUID(使用QUuid)。API不支持的其他扩展类型由Tag类型的QCborValue表示。标签可以通过tag()检索,而标记值则通过taggedValue()检索。

为了支持未来兼容性,包含扩展Qt类型的QCborValue与相同内容的标签类型相比是相等的。换句话说,以下表达式是真的

    QCborValue(uuid) == QCborValue(QCborKnownTags::Uuid, uuid.toRfc4122());

未定义和null值

QCborValue可以包含一个值为“null”的值,它不属于任何特定类型。它类似于C++中的std::nullptr_t类型,其唯一可能的值是nullptr。QCborValue有一个接受此类型的构造函数,并创建一个null QCborValue。

空值用于表示一个可选值不存在。在这方面,当取消选择时,它与C++标准库类型std::optional相似。与C++类型不同,CBOR null只是一个类型名为“Null”,并且无法确定它替换的是什么具体类型。

QCborValue 还可以是未定义类型,它表示“未定义”的值。事实上,这就是 QCborValue 默认构造函数所创建的。

未定义值与 null 值不同。null 用于表示未提供的可选值,而 undefined 通常用于表示无法提供预期值,通常由于错误或无法满足的先决条件。

此类值是完全有效的,可能出现在 CBOR 流中,与 JSON 内容和 QJsonValue 的未定义位不同。但像 QJsonValue 的 Undefined 一样,它是由 CBOR 容器的 value() 或只读操作符 [] 返回的,因为这些操作涉及无效的查找(对于 QCborArray,索引超出范围;对于 QCborMap,未找到键)。无法区分这种情况和 Undefined 的值,因此如果需要这样做,请检查 QCborArray 的大小,并使用 QCborMap 迭代器 API。

简单类型

CBOR 支持额外的简单类型,就像 Null 和 Undefined 一样,它们不携带其他值。它们可以互换地称为“简单类型”和“简单值”。CBOR 将布尔值编码为两种不同的类型(一个用于 true,一个用于 false),但 QCborValue 为它们提供了一个方便的 API。

目前没有其他定义的 CBOR 简单类型。QCborValue 通过 API 如 isSimpleType() 和 toSimpleType() 支持它们,这些 API 可用于与 Qt API 更新前的未来规范保持兼容。在相关规范发布之前不建议使用它们,因为其他 CBOR 实现可能不完全支持它们。

CBOR 支持

QCborValue 支持创建规范和严格流所需的全部 CBOR 功能。它几乎实现了在 RFC 7049 中指定的所有功能。

以下表格列出了 QCborValue 支持的 CBOR 功能。

功能支持
无符号数是 (qint64 范围)
负数是 (qint64 范围)
字节字符串
文本字符串
分块字符串见下文
标签是(任意)
布尔值
Null
未定义
任意简单值
半精度浮点(16位)
单精度浮点(32位)
双精度浮点(64位)
无穷和 NaN 浮点数
确定长度的数组和映射
不确定长度的数组和映射
除了字符串和整数之外的字段键类型是(任意)

QCborValue 中的整数限制在 qint64 类型范围内。也就是说,从 -9,223,372,036,854,775,808 (-263) 到 9,223,372,036,854,775,807 (263 - 1)。CBOR 本身可以表示超出此范围的整数值,但 QCborValue 不支持这些值。在解码包含这些值之一的流时,使用 fromCbor(),QCborValue 会自动转换为 Double,这可能会丢失高达 11 位精度。

fromCbor() 可以解码分块字符串,但始终会将块合并到单个 QCborValue 中。因此,使用 toCbor()(这是规范所要求的)时始终写入非分块字符串。

QCborValue 会将 CBOR 流中的半精度和单精度浮点值始终转换为双精度。函数 toCbor() 可以接收一个参数,指示重新创建它们。

QCborValueRef

QCborValueRef 是用于 QCborArrayQCborMap 的辅助类。您在使用这些类中的任何一个可变 API 时会得到此类型。与 QCborValue 不同,可以为此类分配新值。当这样做时,它引用的数组或映射将被新值修改。在所有其他方面,其 API 与 QCborValue 完全相同。

{CBOR 数据解析和显示}

另请参阅 QCborArrayQCborMapQCborStreamReaderQCborStreamWriterQJsonValueQJsonDocument序列化转换器保存和加载游戏

成员类型文档

enum QCborValue::DiagnosticNotationOption
flags QCborValue::DiagnosticNotationOptions

此枚举用于 toDiagnosticNotation() 函数的选项参数中,以修改输出格式。

常量说明
QCborValue::Compact0x00不使用任何换行符,生成紧凑表示形式。
QCborValue::LineWrapped0x01使用换行符,每行一个 QCborValue
QCborValue::ExtendedFormat0x02使用一些不同的选项来表示值,这些选项在 RFC 7049 中找不到。这些选项可能会更改。

目前,ExtendedFormat 将更改字节数组的表示方式。没有它,它们始终以十六进制编码,不带空格。有它时,QCborValue::toCbor() 将使用带有空格的十六进制、base64 或 base64url 编码,具体取决于上下文。

The DiagnosticNotationOptions 类型是 QFlags<DiagnosticNotationOption> 的 typedef。它存储 DiagnosticNotationOption 值的 OR 组合。

另请参阅 toDiagnosticNotation

enum QCborValue::EncodingOption
flags QCborValue::EncodingOptions

此枚举用于 toCbor() 函数的选项参数,以修改编码器的行为。

常量说明
QCborValue::NoTransformation0(默认) 不执行任何转换。
QCborValue::UseFloat0x02指示编码器尽可能使用 IEEE 754 单精度浮点数(即,float)。
QCborValue::UseFloat16UseFloat | 0x04指示编码器尽可能使用 IEEE 754 半精度浮点数(即,qfloat16),这隐含了 UseFloat
QCborValue::UseIntegers0x08指示编码器在类型为 Double 的值包含整数时使用整数。

使用 UseFloat16 是在规范格式中编码流所必需的,但除此之外不必要。

The EncodingOptions 类型是 QFlags<EncodingOption> 的 typedef。它存储 EncodingOption 值的 OR 组合。

另请参阅 toCbor

enum QCborValue::Type

此枚举表示 QCborValue 类型。它由 type() 函数返回。

CBOR 内置类型包括

常量说明
QCborValue::Integer0x00qint64:一个整数值
QCborValue::ByteArray0x40QByteArray:一个字节数组(“字节字符串”)
QCborValue::String0x60QString:一个 Unicode 字符串(“文本字符串”)
QCborValue::Array0x80QCborArray:一个 QCborValues 数组
QCborValue::Map0xa0QCborMap:QCborValue的关联容器
QCborValue::SimpleType0x100QCborSimpleType:几个简单类型/值之一
QCborValue::FalseSimpleType + int(QCborSimpleType::False)bool:值false的简单类型
QCborValue::TrueSimpleType + int(QCborSimpleType::True)bool:值true的简单类型
QCborValue::NullSimpleType + int(QCborSimpleType::Null)std::nullptr_t:空值的简单类型
QCborValue::UndefinedSimpleType + int(QCborSimpleType::Undefined)(无类型) 未定义值的简单类型
QCborValue::Double0x202double:双精度浮点数
QCborValue::Invalid-1不是一个有效的值,这通常表示CBOR解码错误

此外,QCborValue还可以表示扩展类型

常量说明
QCborValue::Tag0xc0一个未知或未被识别的扩展类型,通过其标签(QCborTag)和标记值(一个QCborValue)表示
QCborValue::DateTime0x10000QDateTime:日期和时间戳
QCborValue::Url0x10020QUrl:URL或URI
QCborValue::RegularExpression0x10023QRegularExpression:正则表达式的模式
QCborValue::Uuid0x10025QUuid:UUID

参见 类型

成员函数文档

QCborValue::QCborValue(QCborArray &&a)

QCborValue::QCborValue(const QCborArray &a)

使用数组a创建一个QCborValue。可以使用toArray()在以后检索该数组。

参见 toArray(),isArray()和isMap

QCborValue::QCborValue(QCborMap &&m)

QCborValue::QCborValue(const QCborMap &m)

使用映射m创建一个QCborValue。可以使用toMap()在以后检索该映射。

参见 toMap(),isMap()和isArray

QCborValue::QCborValue(QCborKnownTags tag, const QCborValue &tv = QCborValue())

QCborValue::QCborValue(QCborTag tag, const QCborValue &tv = QCborValue())

创建一个代表标签值tag,标记值tv的扩展类型QCborValue。可以使用tag()检索标签,使用taggedValue()检索标记值。

参见 isTag(),tag(),taggedValue() 以及 QCborKnownTags

QCborArray QCborValue::toArray() const

QCborArray QCborValue::toArray(const QCborArray &defaultValue) const

返回此 QCborValue 中存储的数组值,如果它是数组类型。否则返回 defaultValue

注意,此函数不会将其他类型转换为 QCborArray

参见 isArray(),isByteArray(),isMap(),isContainer() 和 toMap()。

QCborMap QCborValue::toMap() const

QCborMap QCborValue::toMap(const QCborMap &defaultValue) const

如果此 QCborValue 是映射类型,则返回存储在其中的映射值。否则返回 defaultValue

注意,此函数不会将其他类型转换为 QCborMap

参见 isMap(),isArray(),isContainer() 和 toArray()。

[静态] QCborValue QCborValue::fromCbor(const char *data, qsizetype len, QCborParserError *error = nullptr)

[静态] QCborValue QCborValue::fromCbor(const quint8 *data, qsizetype len, QCborParserError *error = nullptr)

这是一个重载函数。

datalen 字节转换为 QByteArray,然后调用接受 QByteArray 的此函数重载,如果提供了 error,也会传过去。

QCborValue::QCborValue()

创建一个类型为 Undefined 的 QCborValue。

CBOR 未定义值用于表示信息缺失,通常是上一次操作未按预期完成的结果。它们也由 QCborArrayQCborMap API 用于表示要查找的项目未找到。

未定义值由 Undefined simple type 表示。因此,带有未定义值的 QCborValue 也将返回 true 对 isSimpleType() 和 isSimpleType(QCborSimpleType::Undefined)

未定义值与空值不同。

带有未定义值的QCborValue对象也与无效的QCborValue对象不同。API不会创建无效的QCborValue,但可能在解析错误的结果中存在。

相关内容isUndefined()、isNull() 和 isSimpleType()。

QCborValue::QCborValue(QCborValue::Type )

创建一个类型为 的QCborValue。与该类型关联的值(如果有)将被默认构造。

参见 类型

QCborValue::QCborValue(std::nullptr_t)

创建一个 Null 类型的QCborValue。

CBOR空值用于表示未提供的可选值。它们与未定义值不同,因为空值通常不是早前错误或问题的结果。

相关内容isNull()、isUndefined() 和 isSimpleType()。

QCborValue::QCborValue(bool )

创建一个布尔值为 的QCborValue。该值以后可以用 toBool() 方法检索。

内部,CBOR布尔值由一对类型表示,一个用于true,一个用于false。因此,布尔QCborValue将对 isSimpleType() 和 isSimpleType(QCborSimpleType::False)isSimpleType(QCborSimpleType::True) 中的一个返回true。

相关内容toBool()、isBool()、isTrue()、isFalse() 和 isSimpleType()。

QCborValue::QCborValue(qint64 )

创建一个整数值为 的QCborValue。此值以后可以用 toInteger() 方法检索。

CBOR整数值与浮点值不同。因此,即使对象中包含的值相同,包含整数的QCborValue对象与包含浮点数的QCborValue对象也会进行比较。

相关内容toInteger()、isInteger() 和 isDouble()。

QCborValue::QCborValue(double )

创建一个浮点值为 的QCborValue。此值以后可以用 toDouble() 方法检索。

CBOR浮点值与整数值不同。因此,即使对象中包含的值相同,包含整数的QCborValue对象与包含浮点数的QCborValue对象也会进行比较。

相关内容toDouble()、isDouble() 和 isInteger()。

QCborValue::QCborValue(QCborSimpleType )

创建一个简单类型为 的QCborValue。类型可以用 toSimpleType() 以及 isSimpleType(st) 方法检索。

CBOR简单类型是没有关联值的类型,如C++的 std::nullptr_t 类型,它的唯一可能值是 nullptr

如果stQCborSimpleType::Null,则相应的QCborValue将是空值类型,类似地,如果stQCborSimpleType::Undefined,也会有相同的结果。如果stQCborSimpleType::FalseQCborSimpleType::True,则创建的QCborValue将是一个分别包含false或true值的布尔值。

此函数可以用于API中未定义的简单类型。例如,要创建一个具有简单类型12的QCborValue,可以编写:

简单类型应该在相应的规范发布之前不要使用,因为其他实现可能无法正确支持它们。简单类型值24到31被保留,不得使用。

isSimpleType(),isNull(),isUndefined(),isTrue(),isFalse()

QCborValue(const QByteArray &ba)

使用字节数组值ba创建一个QCborValue。可以使用toByteArray()方法稍后检索该值。

参见toByteArray(),isByteArray()和isString()。

QCborValue(const QString &s)

使用字符串值s创建一个QCborValue。可以稍后使用toString()方法检索该值。

参见toString(),isString()和isByteArray()。

QCborValue(QStringView s)

使用字符串值s创建一个QCborValue。可以稍后使用toString()方法检索该值。

参见toString(),isString()和isByteArray()。

QCborValue(QLatin1StringView s)

这是一个重载函数。

使用由s检索的拉丁-1字符串创建一个QCborValue。可以稍后使用toString()方法检索该值。

参见toString(),isString()和isByteArray()。

[显式]QCborValue(const QDateTime &dt)

创建一个包含由dt表示的日期/时间扩展值的QCborValue对象。可以使用toDateTime()方法稍后检索该值。

CBOR日期/时间类型是使用标记作为扩展类型的:要么是一个标记为DateTime的字符串(以ISO日期格式),要么是一个标记为UnixTime_t的数字(自1970年1月1日起的秒数,UTC)。在解析CBOR流时,QCborValue会将UnixTime_t转换为基于字符串的类型。

参见toDateTime(),isDateTime()和taggedValue()。

[显式]QCborValue(const QUrl &url)

创建一个包含由url表示的URL扩展值的QCborValue对象。可以稍后使用toUrl()方法检索该值。

CBOR URL 类型是一个扩展类型,由标签为Url的字符串表示。

另请参阅toUrl(),isUrl(),以及taggedValue

[explicit] QCborValue::QCborValue(const QRegularExpression &rx)

创建一个 QCborValue 对象,其类型为正则表达式扩展类型,包含由 rx 表示的值。可以使用 toRegularExpression() 在以后检索该值。

CBOR 正则表达式类型是一个扩展类型,由标签为RegularExpression的字符串表示。请注意,CBOR 正则表达式只存储模式,因此 QRegularExpression 对象可能携带的任何标记都将丢失。

另请参阅toRegularExpression(),isRegularExpression(),以及taggedValue

[explicit] QCborValue::QCborValue(const QUuid &uuid)

创建一个 QCborValue 对象,其类型为 UUID 扩展类型,包含由 uuid 表示的值。可以使用 toUuid() 在以后检索该值。

CBOR UUID 类型是一个扩展类型,由标签为Uuid的字节数组表示。

另请参阅toUuid(),isUuid(),以及taggedValue

[noexcept] QCborValue::QCborValue(const QCborValue &other)

other 的内容复制到该对象中。

[noexcept] QCborValue::QCborValue(QCborValue &&other)

这是一个重载函数。

other QCborValue 对象的内容移动到该对象中,并释放此对象的所有资源。

[noexcept] QCborValue::~QCborValue()

销毁当前的 QCborValue 对象,并释放任何关联的资源。

int QCborValue::compare(const QCborValue &other) const

比较此值和 other,并返回一个整数,表示此值是否应排在 other 之前(如果结果为负)或之后(如果结果为正)。如果此函数返回 0,则两个值相等并包含相同的内部内容。

如果每个 QCborValue 均包含一个数组或映射,则比较将递归到它们包含的元素中。

扩展类型

QCborValue 与包含扩展类型(如 UrlUrl及其相应的标记表示形式)的 QCborValue 相等。例如,以下表达式为真

    QCborValue(QUrl("https://example.com")) == QCborValue(QCborKnownTags::Url, "https://example.com");

请注意,像QUrlQDateTime这样的Qt类型会对它们的参数进行标准化和其他修改。上述表达式之所以成立,仅仅是因为右侧的字符串是左侧的QCborValue所采用的标准化的值。例如,如果两边的“https”部分都是大写,比较将失败。有关QCborValue执行的标准化信息,请参阅采用相应Qt类型的构造函数的文档。

排序顺序

在CBOR中,排序顺序由RFC 7049,第3.9节定义,该节讨论了在遵循规范编码时在映射中键的排序。根据规范,“对键数据项的表示形式进行排序”,并列出以下后果:

  • "如果两个键的长度不同,则较短的键先排序;"
  • "如果两个键的长度相同,则按字节顺序值较低的键先排序。"

这导致了令人意想不到的QCborValue排序,此函数的结果与稍后通过比较包含的元素检索到的结果不同。例如,包含字符串“zzz”的QCborValue排在包含字符串“foobar”的QCborValue之前,尽管当作为QStringsQByteArrays比较时,“zzz”排在“foobar”之后(字典顺序)。

规范没有清楚地指出应如何对不同类型的值进行排序(它说排序不应该注意主类型的3/5位分割)。QCborValue假定类型也应该排序。类型枚举的QCborValue::Type的数值按此顺序排列,上述扩展类型除外,它们按它们的带标签等效项比较。

注意:排序顺序是初步的,可能随时更改。目前,应用程序不应依赖此函数返回的顺序。

另请参阅QCborArray::compare(),QCborMap::compare()和运算符==()。

[静态] QCborValue QCborValue::fromCbor(QCborStreamReader &reader)

从找到的CBOR流中解码一个项目,并返回等效表示。此函数是递归的:如果项目是映射或数组,它将解码映射或数组中找到的所有项目,直到最外层对象完成。

不需要在此QCborStreamReader的根元素上使用此函数。例如,以下代码说明了如何从文件开头跳过CBOR签名标签

    if (reader.isTag() && reader.toTag() == QCborKnownTags::Signature)
        reader.next();

    QCborValue contents = QCborValue::fromCbor(reader);

返回的值可能部分完整且与有效的QCborValue难以区分,即使解码失败。要确定是否发生错误,请检查reader.lastError

另请参阅toCbortoDiagnosticNotationtoVarianttoJsonValue()。

[静态] QCborValue QCborValue::fromCbor(const QByteArray &ba, QCborParserError *error = nullptr)

这是一个重载函数。

解码从字节数组 ba 中找到的 CBOR 流中的一个项,并返回等效表示。该函数是递归的:如果项是映射或数组,它将解码在映射或数组中找到的所有项,直到最外层对象完成。

如果发生错误,此函数将错误状态存储在由 error 指向的对象中,包括错误发生的偏移。如果没有发生错误,它在错误状态中存储 NoError,并存储它消耗的字节数(即,它存储第一个未使用字节的偏移)。使用这些信息可以解析同一个字节数组中可能存在的其他数据。

返回值可能是不完整的,即使解码失败也可能与有效的 QCborValue 无法区分。要确定是否发生错误,请检查 error 中是否存储了错误。此函数在第一次错误发生后立即停止解码。

另请参阅toCbortoDiagnosticNotationtoVarianttoJsonValue()。

[静态] QCborValue QCborValue::fromJsonValue(const QJsonValue &v)

v 中的 JSON 值转换为对应的 CBOR 值并返回它。从 JSON 到 CBOR 的转换没有数据损失,因为 CBOR 类型集比 JSON 更丰富。此外,使用此函数转换到 CBOR 的值可以使用 toJsonValue() 无数据损失地转换回 JSON。

以下表格列出了 JSON 类型到 CBOR 类型的映射

JSON 类型CBOR 类型
布尔布尔
数字整数(如果数字没有小数部分且在 qint64 范围内)或双精度浮点数
字符串字符串
数组数组
对象映射
NullNull

QJsonValue 也可以是未定义的,表示之前未能完成操作(例如,在一个对象中搜索不存在键)。未定义的值不是 JSON 类型,并且可能不出现在 JSON 数组和对象中,但此函数会在相应的 QJsonValue 是未定义的时返回 QCborValue 未定义值。

另请参阅 toJsonValue(),fromVariant(),QCborArray::fromJsonArray() 和 QCborMap::fromJsonObject()。

[静态] QCborValue QCborValue::fromVariant(const QVariant &variant)

QVariant variant 转换为 QCborValue 并返回它。

QVariants 可能包含大量不同的元类型,其中许多在 CBOR 中没有对应的表示。这包括所有用户定义的元类型。在准备使用 CBOR 进行传输时,建议仔细编码每个值以防止表示丢失。

以下表格列出了此函数将应用的转换

Qt (C++) 类型CBOR 类型
无效 (QVariant())未定义
bool布尔
std::nullptr_tNull
shortushortintuintqint64整数
quint64整数,或者如果超出qint64范围,则使用Double
浮点数双精度浮点数双精度浮点数
QByteArray字节数组
QDateTime日期时间
QCborSimpleType简单类型
QJsonArray数组,使用QCborArray::formJsonArray()转换
QJsonDocument数组或映射
QJsonObject映射,使用QCborMap::fromJsonObject()转换
QJsonValue使用fromJsonValue()转换
QRegularExpression正则表达式
QString字符串
QStringList数组
QVariantHash映射
QVariantList数组
QVariantMap映射
QUrlURL
QUuidUUID

如果QVariant::isNull()返回true,无论QVariant携带的类型是什么,都将返回或插入到列表或对象中的null QCborValue。注意,Qt 6.0中的行为更改将影响QVariant::isNull(),这也会影响此函数。

对于其他未列出的类型,将尝试转换为字符串,通常通过调用QVariant::toString()。如果转换失败,则值将被替换为未定义的CBOR值。请注意,QVariant::toString()对于大多数类型都是损失性的。

请注意,通过QVariant::toString()进行的转换可能会随时更改。未来QVariantQCborValue可能被扩展以支持更多类型,这将导致此函数执行转换的方式发生变化。

另请参阅toVariant()、fromJsonValue()、QCborArray::toVariantList()、QCborMap::toVariantMap()和QJsonValue::fromVariant()。

bool QCborValue::isArray() const

如果此QCborValue是数组类型,则返回true。可以使用toArray()获取数组值。

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

bool QCborValue::isBool() const

如果此QCborValue是布尔值,则返回true。可以使用toBool()获取值。

另请参阅type()、toBool()、isTrue()和isFalse()。

bool QCborValue::isByteArray() const

如果此QCborValue是字节数组类型,则返回true。可以使用toByteArray()获取字节数组值。

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

bool QCborValue::isContainer() const

此便捷函数返回true,如果QCborValue是数组或映射。

另请参阅isArray()和isMap()。

bool QCborValue::isDateTime() const

如果此QCborValue是日期/时间类型,则返回true。可以使用toDateTime()获取值。日期/时间是使用标签DateTime的扩展类型。

另外,在从CBOR流解码时,QCborValue还将解释值为UnixTime_t的标签,并将它们转换为等效的日期/时间。

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

bool QCborValue::isDouble() const

如果此 QCborValue 是浮点类型,则返回 true。可以使用 toDouble() 获取值。

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

bool QCborValue::isFalse() const

如果此 QCborValue 是具有 false 值的布尔值,则返回 true。该函数存在是因为,在内部,CBOR 布尔值存储为两种不同的类型,一种用于 true,一种用于 false。

另请参阅type()、isBool()、isTrue() 和 toBool()。

bool QCborValue::isInteger() const

如果此 QCborValue 是整数类型,则返回 true。可以使用 toInteger() 获取整数值。

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

bool QCborValue::isInvalid() const

如果此 QCborValue 不是一个有效的类型,则返回 true。无效的 QCborValue 与具有未定义值的那些不同,它们通常表示解码错误。

另请参阅isUndefined() 和 isNull().

bool QCborValue::isMap() const

如果此 QCborValue 是映射类型,则返回 true。可以使用 toMap() 获取映射值。

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

bool QCborValue::isNull() const

如果此 QCborValue 是 null 类型,则返回 true。

CBOR空值用于表示未提供的可选值。它们与未定义值不同,因为空值通常不是早前错误或问题的结果。

null 值与未定义值和无效的 QCborValue 对象不同。API 不会创建无效的 QCborValue,但它们可能是解析错误的结果。

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

bool QCborValue::isRegularExpression() const

如果此 QCborValue 包含正则表达式模式,则返回 true。可以使用 toRegularExpression() 获取模式。

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

bool QCborValue::isSimpleType() const

如果此 QCborValue 是 CBOR 简单类型之一,则返回 true。可以使用 type() 在以后检索类型本身,即使类型在 API 中没有枚举也是如此。它们还可以使用 isSimpleType(QCborSimpleType) 重载进行检查。

另请参阅 QCborSimpleTypeisSimpleType(QCborSimpleType)和toSimpleType().

bool QCborValue::isSimpleType(QCborSimpleType st) const

这是一个重载函数。

如果此QCborValue是简单类型,并且toSimpleType()会返回st,则返回true;否则返回false。此函数可以用来检查任何CBOR简单类型,即使API中没有枚举定义的类型。例如,对于值12的简单类型,你可以写

    value.isSimpleType(QCborSimpleType(12));

另请参阅 QCborValue::QCborValue(QCborSimpleType)、isSimpleType()、isFalse()、isTrue()、isNullisUndefined()和toSimpleType

bool QCborValue::isString() const

如果此QCborValue是字符串类型,则返回true。可以通过toString()检索字符串值。

另请参阅 type()和toString

bool QCborValue::isTag() const

如果此QCborValue是标签类型,则返回true。可以使用tag()和taggedValue()检索标签值。

此函数也针对API已识别的扩展类型返回true。对于在Qt API更新之前直接处理扩展类型的代码,可以使用taggedValue()重建标签+标签值对。

另请参阅 type()、tag()、taggedValue()和taggedValue

bool QCborValue::isTrue() const

如果此QCborValue的布尔值为true,则返回true。此函数存在,因为CBOR布尔类型在内部以两种类型存储,一种用于false,一种用于true。

另请参阅 type()、isBool()、isFalsetoBool

bool QCborValue::isUndefined() const

如果此QCborValue是未定义类型,则返回true。

CBOR 未定义值用于表示信息缺失,通常是上一次操作未按预期完成的结果。它们也由 QCborArrayQCborMap API 用于表示要查找的项目未找到。

未定义值与null值不同。

具有未定义值的QCborValue对象也与无效的QCborValue对象不同。API不会创建无效的QCborValue对象,但它们可能是解析错误的结果。

另请参阅 type()、isNullisInvalid

bool QCborValue::isUrl() const

如果此QCborValue是URL类型,则返回true。可以通过toUrl()检索URL值。

另请参阅 type()和toUrl

bool QCborValue::isUuid() const

如果此 QCborValue 包含UUID,则返回true。可以使用 toUuid() 获取值。

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

[noexcept] void QCborValue::swap(QCborValue &other)

交换此 QCborValue 对象和 other 的内容。

QCborTag QCborValue::tag(QCborTag defaultValue = QCborTag(-1)) const

如果此扩展 QCborValue 对象为标签类型,则返回其标签,否则返回 defaultValue

CBOR通过将与存储表示相关联的数字(标签)表示扩展类型。此函数返回该数字。要获取表示,请使用 taggedValue()。

另请参阅 isTag(),taggedValue(),isDateTime(),isUrl(),isRegularExpression() 和 isUuid()。

QCborValue QCborValue::taggedValue(const QCborValue &defaultValue = QCborValue()) const

如果此扩展 QCborValue 对象为标签类型,则返回其标签值,否则返回 defaultValue

CBOR通过将数字(标签)与存储表示相关联来表示扩展类型。此函数返回该表示。要获取标签,请使用 tag()。

另请参阅 isTag(),tag(),isDateTime(),isUrl(),isRegularExpression() 和 isUuid()。

bool QCborValue::toBool(bool defaultValue = false) const

如果此 QCborValue 为布尔类型,则返回存储在其中的布尔值。否则,返回 defaultValue

另请参阅 isBool(),isTrue() 和 isFalse()。

QByteArray QCborValue::toByteArray(const QByteArray &defaultValue = {}) const

如果此 QCborValue 为字节数组类型,则返回存储在其内的字节数组值。否则,返回 defaultValue

请注意,此函数不执行从其他类型到 QByteArray 的转换。

另请参阅 isByteArray(),isString() 和 toString()。

QByteArray QCborValue::toCbor(QCborValue::EncodingOptions opt = NoTransformation) const

使用在 opt 中指定的选项将此 QCborValue 对象编码为其CBOR表示形式,并返回包含该表示形式的字节数组。

此函数不会失败,除非此QCborValue或包含的任何项如果您是一个映射或数组,是无效的。无效类型在API中不会正常生成,但可能由解码错误造成。

默认情况下,此函数不对QCborValue中的值执行转换,直接将所有浮点数写入为双精度(double)类型。如果指定了UseFloat选项,它将使用单精度(float)浮点数,表示不会因为这种表示方式而丢失精度。包括无穷大和NaN值。

同样地,如果指定了UseFloat16,此函数将尝试使用半精度(qfloat16)浮点数,如果转换为该类型不会导致精度损失。这一点对于无穷大和NaN始终成立。

如果指定了UseIntegers,则对于包含实际整数的任何浮点值,它将使用整数。

另请参阅 fromCbor(),fromVariant()和fromJsonValue()。

void QCborValue::toCbor(QCborStreamWriter &writer, QCborValue::EncodingOptions opt = NoTransformation) const

这是一个重载函数。

将此QCborValue对象编码为其CBOR表示形式,并使用指定的opt选项和指定的writer写入器写入。相同的写入器可以被多个QCborValues使用,例如,为了在更大的数组中编码不同的元素。

此函数不会失败,除非此QCborValue或包含的任何项如果您是一个映射或数组,是无效的。无效类型在API中不会正常生成,但可能由解码错误造成。

默认情况下,此函数不对QCborValue中的值执行转换,直接将所有浮点数写入为双精度(二进制64)类型。如果指定了UseFloat选项,则将使用单精度(二进制32)浮点数,在保持精度的前提下用于任何浮点值。这包括无穷大和NaN值。

同样地,如果指定了UseFloat16,此函数将尝试使用半精度(二进制16)浮点数,如果转换为该类型不会导致精度损失。这始终适用于无穷大和NaN。

如果指定了UseIntegers,则对于包含实际整数的任何浮点值,它将使用整数。

另请参阅 fromCbor(),fromVariant()和fromJsonValue()。

QDateTime QCborValue::toDateTime(const QDateTime &defaultValue = {}) const

如果在扩展日期时间类型中,返回此QCborValue存储的日期时间值。否则返回defaultValue

注意,此函数不会执行其他类型到QDateTime的转换。

另请参阅 isDateTime(),isTag()和taggedValue()。

QString QCborValue::toDiagnosticNotation(QCborValue::DiagnosticNotationOptions opts = Compact) const

创建与当前CBOR对象等价的诊断表示,并返回它。该opts参数控制表示法的方言。诊断表示法在调试中非常有用,可以帮助开发者了解存储在QCborValue或CBOR流中的值。因此,Qt API不提供将诊断信息解析回内存格式或CBOR流的支撑,尽管这种表示形式是唯一的,并且可能会有所不同。

CBOR诊断表示法由RFC 7049的第6节定义。它是CBOR流的文本表示,与JSON非常相似,但支持在JSON中找不到的CBOR类型。由ExtendedFormat标志启用的扩展格式目前处于某些IETF草案中,其格式可能发生变化。

此函数产生的表示与toCbor()函数产生的表示相同,但不会提供任何转换选项。这也意味着,如果使用fromCbor()创建对象,并且该函数可能已应用了转换,则此函数可能不会产生创建对象所用的流表示,因为该函数可能会应用转换。要查看无转换的流的高保真表示,请参见cbordump示例。

另请参阅toCbor()和QJsonDocument::toJson

double QCborValue::toDouble(double defaultValue = 0) const

如果当前QCborValue为Double类型,则返回存储在此处的浮点值。如果它是整数类型,此函数将返回将整数值转换为double的结果。在其他任何情况下,它返回defaultValue

另请参阅isDouble()、isIntegertoInteger

qint64 QCborValue::toInteger(qint64 defaultValue = 0) const

如果当前QCborValue为整数类型,则返回它存储的整数值。如果它是双精度类型,则此函数将返回将浮点值转换为整数的结果。在其他任何情况下,它返回defaultValue

另请参阅isInteger()、isDoubletoDouble

QJsonValue QCborValue::toJsonValue() const

将此QCborValue对象转换为等效的JSON表示,并以QJsonValue返回。

请注意,CBOR包含的值集比JSON更丰富和更广泛,因此在此转换中可能会丢失某些信息。以下表比较CBOR类型与JSON类型,并指出是否可能丢失信息。

CBOR 类型JSON 类型注释
布尔布尔无数据损失可能
双精度浮点数数字无穷大和NaN将转换为Null;其他值无数据损失
整数数字如果在转换中整数大于253或小于-253,则可能发生数据损失。
NullNull无数据损失可能
未定义Null类型信息丢失
字符串字符串无数据损失可能
字节数组字符串转换为无损编码如Base64url,但字符串和字节数组之间的区别将丢失
其他简单类型字符串类型信息丢失
数组数组转换应用于每个包含的值
映射对象键转换为字符串;值根据此表转换
标签和扩展类型特殊标签本身已丢失,标记值将转换为JSON

有关CBOR映射键转换为字符串的信息,请参见QCborMap::toJsonObject

如果此QCborValue包含未定义的值,此函数也将返回一个未定义的QJsonValue。注意,JSON不支持未定义的值,未定义的QJsonValues是对规范的扩展。它们不能保存在一个QJsonArrayQJsonObject中,但可以从函数中返回以指示失败。在其他所有意图和目的上,它们与null相同。

标签和扩展类型的特殊处理

一些标签被特别处理,会改变标记值从CBOR到JSON的转换。下表列出了这些特殊情况

标签CBOR 类型转换
预期的Base64url字节数组将字节数组编码为Base64url
预期的Base64字节数组将字节数组编码为Base64
预期的Base16字节数组将字节数组编码为十六进制
URLURL和字符串使用QUrl::toEncoded()使编码规范化为URL的完全编码格式
UUIDUUID和字节数组使用QUuid::toString()创建字符串表示

另请参阅fromJsonValuetoVariantQCborArray::toJsonArrayQCborMap::toJsonObject

QRegularExpression QCborValue::toRegularExpression(const QRegularExpression &defaultValue = {}) const

如果此QCborValue是正则表达式模式扩展类型,返回存储在其中的正则表达式值,否则返回defaultValue

注意,此功能不会将其他类型转换为QRegularExpression

另请参阅isRegularExpressionisTagtaggedValue

QCborSimpleType QCborValue::toSimpleType(QCborSimpleType defaultValue = QCborSimpleType::Undefined) const

如果此QCborValue是简单类型,则返回该类型。如果不是简单类型,则返回defaultValue

以下类型是简单类型,此函数将返回列出的值

另请参阅typeisSimpleTypeisBoolisTrueisFalseisTrueisNullisUndefined

QString QCborValue::toString(const QString &defaultValue = {}) const

如果此QCborValue是字符串类型,则返回存储在此中的字符串值,否则返回defaultValue

请注意,此函数不会将其他类型转换为 QString

另见 isString(),isByteArray() 和 toByteArray()。

QUrl QCborValue::toUrl(const QUrl &defaultValue = {}) const

如果此 QCborValue 是 URL 扩展类型,则返回存储在其中的 URL 值。否则,返回 defaultValue

请注意,此函数不会将其他类型转换为 QUrl

另见 isUrl(),isTag() 和 taggedValue()。

QUuid QCborValue::toUuid(const QUuid &defaultValue = {}) const

如果此 QCborValue 是 UUID 扩展类型,则返回存储在其中的 UUID 值。否则,返回 defaultValue

请注意,此函数不会将其他类型转换为 QUuid

另见 isUuid(),isTag() 和 taggedValue()。

QVariant QCborValue::toVariant() const

将此值转换为本地 Qt 类型,并返回相应的 QVariant

下表列出了 QCborValue 类型Qt 元类型 之间的映射。

CBOR 类型Qt 或 C++ 类型备注
整数qint64
双精度浮点数double
布尔bool
Nullstd::nullptr_t
未定义无类型 (QVariant())
字节数组QByteArray
字符串QString
数组QVariantList递归转换所有值
映射QVariantMap键类型将被 "字符串化"
其他简单类型QCborSimpleType
日期时间QDateTime
URLQUrl
正则表达式QRegularExpression
UUIDQUuid
其他标签特殊忽略该标签,并使用该函数转换标签值

请注意,CBOR 地图和数组中的值也将使用此函数递归转换,并以 QVariantMapQVariantList 的形式存储。您不会在 QVariants 中找到 QCborMapQCborArray

与 CBOR 不同,QVariantMaps 使用字符串键,因此将 QCborMap 转换为 QVariantMap 将隐含对键值的 "字符串化"。有关详细信息,请参阅 QCborMap::toJsonObject()。

另见 fromVariant(),toJsonValue(),QCborArray::toVariantList() 和 QCborMap::toVariantMap()。

QCborValue::Type QCborValue::type() const

返回此 QCborValue 的类型。该类型也可以稍后通过 "isXxx" 中的一个函数检索。

另请参阅 isInteger()函数,isByteArray()函数,isString()函数,isArray()函数,isMap()函数,isTag()函数,isFalse()函数,isTrue()函数,isBool()函数,isNull()函数,isUndefined函数,isDouble()函数,isDateTime()函数,isUrl()函数,isRegularExpression()函数,以及isUuid()函数。

[noexcept] bool QCborValue::operator!=(const QCborValue &other) const

比较当前值和other,如果内容不同,返回true,否则返回false。如果每个QCborValue包含数组或映射,则比较会递归到包含的元素中。

有关Qt中CBOR相等性的更多信息,请参阅QCborValue::compare()。

另请参阅 compare(),QCborValue::operator==(),QCborMap::operator==(),operator==(),和operator<()。

bool QCborValue::operator<(const QCborValue &other) const

比较当前值和other,如果当前值应该在other之前排序,返回true,否则返回false。如果每个QCborValue包含数组或映射,则比较会递归到包含的元素中。

有关CBOR排序顺序的更多信息,请参阅QCborValue::compare()。

另请参阅 compare(),QCborValue::operator==(),QCborMap::operator==(),operator==(),和operator!=()。

[noexcept] QCborValue &QCborValue::operator=(const QCborValue &other)

other的副本替换此QCborValue的内容。

[noexcept] QCborValue &QCborValue::operator=(QCborValue &&other)

这是一个重载函数。

otherQCborValue对象的内容移动到当前对象中,并释放此对象占用的资源。返回对当前对象的引用。

[noexcept] bool QCborValue::operator==(const QCborValue &other) const

检查当前值和other是否含有相同内容,如果相同返回true,否则返回false。如果每个QCborValue包含数组或映射,则比较会递归到包含的元素中。

有关Qt中CBOR相等性的更多信息,请参阅compare

另请参阅 compare(),QCborValue::operator==(),QCborMap::operator==(),operator!=() 和 operator<

const QCborValue QCborValue::operator[](const QString &key) const

如果这个 QCborValue 是一个 QCborMap,则在元素中搜索与 key 匹配的值。如果在映射中没有匹配的 key 或者这个 QCborValue 对象不是一个映射,则返回未定义值。

此函数等价于

    value.toMap().value(key);

另请参阅 operator[](qint64),QCborMap::operator[]QCborMap::value() 和 QCborMap::find

const QCborValue QCborValue::operator[](QLatin1StringView key) const

这是一个重载函数。

如果这个 QCborValue 是一个 QCborMap,则在元素中搜索与 key 匹配的值。如果在映射中没有匹配的 key 或者这个 QCborValue 对象不是一个映射,则返回未定义值。

此函数等价于

    value.toMap().value(key);

另请参阅 operator[](qint64),QCborMap::operator[]QCborMap::value() 和 QCborMap::find

const QCborValue QCborValue::operator[](qint64 key) const

这是一个重载函数。

如果这个 QCborValue 是一个 QCborMap,则在元素中搜索与 key 匹配的值。如果是 QCborArray,则返回索引为 key 的元素。如果数组或映射中没有匹配的值,或者这个 QCborValue 对象不是数组或映射,则返回未定义值。

另请参阅 operator[]QCborMap::operator[]QCborMap::value(),QCborMap::findQCborArray::operator[]QCborArray::at

QCborValueRef QCborValue::operator[](qint64 key)

这是一个重载函数。

返回一个可以用来读取或修改具有给定 key 的条目的 QCborValueRef,作为一个映射或数组。当这个 QCborValue 是一个 QCborMap 或者,对于 0 <= key < 0x10000,是一个 QCborArray 时,此函数与该映射或数组的匹配 operator[] 等效。

在返回引用之前:如果这个 QCborValue 是一个数组但索引超出范围,首先将数组转换为映射(这样码 map[i] 就等于 array[i] 对于每个索引,i,具有有效的 array[i]);否则,如果它不是一个映射,则将一个空映射覆盖它。

另请参阅 operator[]QCborMap::operator[]QCborMap::value(),QCborMap::findQCborArray::operator[]QCborArray::at

QCborValueRef QCborValue::operator[](QLatin1StringView key)

这是一个重载函数。

返回一个可以用来读取或修改具有给定 key 的条目的 QCborValueRef,作为一个映射。当这个 QCborValue 是一个 QCborMap 时,此函数与该映射的匹配 operator[] 等效。

在返回引用之前:如果这个 QCborValue 是一个数组,则首先将其转换为映射(以便每个索引 i 的 map[i]array[i],其中 valid array[i]);如果不是映射,则将其覆盖为一个空映射。

另请参阅 operator[](qint64),QCborMap::operator[]QCborMap::value() 和 QCborMap::find

QCborValueRef QCborValue::operator[](const QString &key)

返回一个可以用来读取或修改具有给定 key 的条目的 QCborValueRef,作为一个映射。当这个 QCborValue 是一个 QCborMap 时,此函数与该映射的匹配 operator[] 等效。

在返回引用之前:如果这个 QCborValue 是一个数组,则首先将其转换为映射(以便每个索引 i 的 map[i]array[i],其中 valid array[i]);如果不是映射,则将其覆盖为一个空映射。

另请参阅 operator[](qint64),QCborMap::operator[]QCborMap::value() 和 QCborMap::find

© 2024 The Qt Company Ltd. 这里包含的文档贡献是该相关所有者的版权。这里提供的文档是根据由自由软件基金会发布的 GNU Free Documentation License 版本 1.3 的条款授权的。Qt 和相应的标志是芬兰和/或全球其他国家的 The Qt Company Ltd. 的商标。所有其他商标均为其各自所有者的财产。