Copyright © 2020-2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
CBOR 是一种紧凑的二进制数据序列化和消息传递格式。本 规范定义了 CBOR-LD 1.0,这是一种基于 CBOR 的关联数据序列化格式。 该编码旨在利用现有的 JSON-LD 生态系统,该生态系统目前已 部署在数亿个系统中,从而为寻求高效编码方案的关联 数据提供一种紧凑的序列化格式。通过采用语义压缩方案,可以实现比 通用压缩方案高出 60% 以上的压缩率。此格式 主要旨在提供一种在存储空间和带宽 受限的编程环境中使用关联数据的方式,以构建可互操作的语义线级 协议,并在基于 CBOR 的存储引擎中高效存储关联数据。
本节描述本文档在 发布时的状态。当前 W3C 出版物列表以及本技术报告的最新修订版可在 W3C 标准和草案 索引中找到。
本文档是实验性的。
有一个 参考实现,它 能够演示本文档中描述的功能。
本文档由 JSON-LD 工作组 作为 工作草案发布,并采用 推荐标准 流程。
作为 工作草案发布并不意味着 获得 W3C 及其成员的认可。
这是一份草案文档,可能随时被其他 文档更新、取代或废弃。除非作为正在进行的工作, 否则不应引用本文档。
本文档由一个 按照 W3C 专利 政策运作的工作组编制。 W3C 维护着一份 公开的专利 披露列表, 其中包含与该工作组交付成果相关的披露; 该页面还包括 披露专利的说明。任何实际 知晓某项专利,并认为该专利包含 必要权利要求的个人, 必须按照 W3C 专利政策第 6 节披露相关信息。
本文档受 2025 年 8 月 18 日 W3C 流程文档约束。
本节为非规范性内容。
CBOR 是一种紧凑的二进制数据序列化和消息传递格式。本 规范定义了 CBOR-LD 1.0,这是一种基于 CBOR 的关联数据序列化格式。 该编码旨在利用现有的 JSON-LD 生态系统,该生态系统目前已 部署在数亿个系统中,从而为寻求高效编码方案的关联 数据提供一种紧凑的序列化格式。通过采用语义压缩方案,可以实现比 通用压缩方案高出 60% 以上的压缩率。此格式 主要旨在提供一种在存储空间和带宽 受限的编程环境中使用关联数据的方式,以构建可互操作的语义线级 协议,并在基于 CBOR 的存储引擎中高效存储关联数据。
本节为非规范性内容。
本文档是关于在 CBOR 中序列化关联 数据的详细规范。本文档主要面向以下读者:
除标记为非规范性的章节外,本规范中的所有创作指南、图表、示例和注释 均为非规范性内容。本规范中的其他所有内容均为规范性内容。
本文档中的关键词 可以、必须 和 可选 应按照 BCP 14 [RFC2119] [RFC8174] 中的说明进行解释,且仅当它们像此处所示一样全部 使用大写字母时如此。
本节为非规范性内容。
可以通过多种方式参与 本规范的开发:
本节为非规范性内容。
CBOR-LD 满足以下设计目标:
同样,以下内容不是设计目标。
在制定本 规范的过程中,已经识别出以下容易出现问题的领域:
本节为非规范性内容。
从高层次来看,CBOR-LD 是 JSON-LD 的一种紧凑二进制序列化格式,它允许 使用以下机制进行额外压缩:
编解码器是以通用方式压缩类型值的基本原语。语义压缩 用于压缩 JSON-LD 术语。注册表字典用于以 特定用例的方式压缩类型值。每一种都是可选的 — CBOR-LD 可以使用这些压缩策略中的任意一种、全部或一个也不使用。 综合起来,针对 特定用例所使用的这些策略集合称为处理模型。处理模型在 4. 处理 模型中有详细说明。
本节为非规范性内容。
语义压缩是创建紧凑 CBOR-LD 载荷的强大工具。其核心思想是 利用外部 JSON-LD 上下文对象的信息内容来压缩 JSON-LD 术语。 这些外部上下文对象对于载荷的创建者和使用者都可用, 因此可以采用可逆方式实现这一过程。
通用的语义压缩过程是获取一个 JSON-LD 文档并执行 以下操作:
@context 值;嵌入式上下文值无法压缩)。
本节为非规范性内容。
如 2. 基本概念中所述,针对给定用例使用的特定压缩和 转换策略集合称为处理模型。 每个 CBOR-LD 载荷都恰好与一个处理模型相关联,该模型由 CBOR-LD 注册表条目选择,其标识符包含在 载荷的 CBOR 标签中(参见 5. CBOR-LD 的 CBOR 标签)。
处理模型决定实现如何将 JSON-LD 文档转换为 CBOR-LD 以及如何从 CBOR-LD 转换回来。具体而言,处理模型指定:
用于特定用例类型值压缩的注册表字典是
CBOR-LD 注册表条目的独立组成部分,通过其
typeTables 字段进行配置(参见
5.1 CBOR-LD 注册表)。它们的选择
独立于处理模型,
并且不属于处理模型的一部分。
未指定
processingModel 的CBOR-LD 注册表条目使用
默认处理模型。默认处理模型由本
规范定义,其行为如下:
xsd:date 和 xsd:dateTime 编解码器,以及
multibase
编解码器,每个编解码器都基于与值关联的 JSON-LD 类型应用。
类型没有适用编解码器或 typeTable 条目的值,以及未被
任何引用上下文覆盖的术语,都保持不变地传递,从而使任何符合要求的 JSON-LD
文档都可以无损往返转换。
当存在时,CBOR-LD 注册表
条目的 processingModel 成员是一个包含
下述成员的映射。当该成员不存在时,将应用默认
处理模型。
semanticCompressiontrue。当为 true 时,术语标识符按照
3. 语义
压缩中的说明自动生成。
codecsurl,后者匹配
节点引用以及其术语以 @type 为 @id 定义的值。
在
转换期间,如果存在绑定到某个值类型的编解码器,则使用该编解码器压缩和解压缩
该值。当 codecs 不存在且未使用默认处理模型时,
不应用通用类型值编解码器。
本规范定义了下表中的编解码器标识符。由其他规范定义的处理模型 可以使用其他编解码器标识符,前提是该规范 定义了相应的编解码器。
| 编解码器标识符 | 编解码器 | 在默认处理 模型中绑定到的类型 |
|---|---|---|
url |
URL 编解码器 | url |
xsd-date |
XSD Date 编解码器 | http://www.w3.org/2001/XMLSchema#date |
xsd-date-time |
XSD DateTime 编解码器 | http://www.w3.org/2001/XMLSchema#dateTime |
multibase |
Multibase 编解码器 | https://w3id.org/security#multibase |
以这种形式表示时,默认处理模型 会启用语义压缩,并 将本规范定义的每个编解码器绑定到其所压缩的类型:
processingModel:
semanticCompression: true
codecs:
url: url
"http://www.w3.org/2001/XMLSchema#date": xsd-date
"http://www.w3.org/2001/XMLSchema#dateTime": xsd-date-time
"https://w3id.org/security#multibase": multibase
注册表条目可以完全省略 processingModel 成员,
并获得相同的行为。
如果用户不希望使用语义压缩,和/或希望使用
默认处理模型之外的编解码器进行压缩,注册表条目可以指定
自定义处理模型。以下是一个不使用语义
压缩且仅使用 xsd-date-time 编解码器的处理模型示例:
processingModel:
semanticCompression: false
codecs:
"http://www.w3.org/2001/XMLSchema#dateTime": xsd-date-time
4.2.1 编解码器标识符 列出了本 规范定义的编解码器。CBOR-LD 编解码器也旨在作为扩展点:处理模型可以 使用此处未指定,而是由定义该处理模型的 规范或其他文档定义的编解码器。
本规范不 限制用户指定的编解码器如何运行,也不限制它们如何定义。 使用此类编解码器定义处理模型的文档 有责任对每个编解码器作出足够精确的规定,以实现可互操作的实现, 并承担测试和正确性的责任。本 规范中定义的编解码器必须使用 IRI 进行标识。
以下示例展示了一个使用编解码器来压缩
https://example.org/vocab#ip-address 类型 IP 地址值的处理模型
processingModel:
semanticCompression: true
codecs:
url: url
"http://www.w3.org/2001/XMLSchema#dateTime": xsd-date-time
"https://example.org/vocab#ip-address": ip-address
其中,ip-address 编解码器的编码和解码行为在外部以算法方式
进行规定。
CBOR-LD 载荷需要能够在二进制层面被识别为 CBOR-LD。CBOR 原生通过 其“标签”功能支持这一点 — 二进制数据中的一个头部值,通过全局注册表描述载荷的 其余部分。
CBOR 标签 0xCB1D(标签值 51997)已注册
在 IANA
CBOR 标签注册表中,以供 CBOR-LD 使用。紧随此标签值之后的
数据标识用于创建
压缩载荷的注册表条目。
CBOR-LD 载荷必须采用如下结构:使用标签
0xCB1D 标记的项
是一个双元素数组,并且第一个元素必须是
主类型 0 整数。
此整数是 CBOR-LD 注册表条目 ID。其二进制结构为
tag([registryEntryId, payload])。
随后使用 CBOR-LD 注册表条目 ID 的值在 CBOR-LD 注册表中查找一个 CBOR-LD 注册表条目。
为了在使用单个 CBOR 标签值的同时,使需要不同 压缩表材料供使用者使用的 CBOR-LD 潜在用例能够无限扩展,我们作出如下定义。
CBOR-LD 注册表是一个全局列表,它向 CBOR-LD 载荷的使用者提供重建解压缩所需术语编解码器映射所需的 信息。一个 CBOR-LD 注册表条目包含以下内容:
Registry Entry ID:一个正整数。
Use Case:此条目要用于的 CBOR-LD 载荷类型。
typeTables:与此注册表条目一起使用的注册表字典集合。每个
注册表字典由一个类型
表类型标识,并将该
类型的值映射到整数,以实现紧凑编码。类型表类型可以是保留
类别之一(context,适用于上下文值;或 url,适用于
@id 类型的 URL 值),也可以是 JSON-LD 类型标识符,在这种情况下,该字典
适用于该类型的类型化字面值。有关这些
字典在编码和解码期间如何选择和应用,请参见 6.5.2
值编解码器。
processingModel:用于此
注册表条目的处理模型。如果此字段
不存在,则注册表条目使用默认处理模型。处理
模型规定以下内容:
xsd:date 和 xsd:dateTime 值以及
multibase 编码值的编解码器 — 以及
每个编解码器所应用的 JSON-LD 类型,以及
processingModel 成员,
包括默认模型的完整示例,请参见
4.2 表示
处理模型。
provisional:一个布尔值,指示该条目是否为临时条目。临时条目
可能会被更改或删除。
字符串 "callerProvidedTable" 可以出现在 typeTables 中,表示对于此用
例,需要一个未在全局定义的
Type Table。
当前 CBOR-LD 注册表可在线获取。
注册要求因所申请的注册表条目 ID 而异。范围如下:
注册请求必须以针对 CBOR-LD 注册表提出的拉取请求形式提交, 并通过仓库的复刻版本发起。这些请求必须包括:
tables 目录中添加一个 .yml 文件,并使用所申请的注册表条目 ID
作为文件名,
其中规定注册表条目的技术内容。如果该文件不符合
预期的文件格式,则请求可能会被拒绝且不作解释。
要注册 256–65,535 范围内的条目,必须随请求提供由公认的标准制定组织 (SDO)发布的成熟规范或标准文档。 判定 某项规范或其他文档是否可接受时,将采用与 W3C 评估 是否允许将组织和文档作为 W3C 标准中的规范性引用时类似的标准。 这些请求将在分配前接受专家审查。JSON-LD 系列 规范的维护者和/或 W3C 工作人员负责 此项审查。
对 ID 65 536 或更高的合理且符合要求的注册请求,将由 注册表仓库维护者按照“先到先得”的原则合并,无需额外 审查。
此算法接受映射 typeTable、整数 registryEntryId 和一个
JSON-LD
文档 jsonldDocument 作为输入,并返回十六进制字符串
cborldBytes。
prefix 设置为把 registryEntryId 传递给
6.6.1 获取
CBOR 标签结构算法所得的结果。
state 设置为空映射。
registryEntryId 关联的注册表条目要求进行语义
压缩:
state.strategy 设置为 "compression"。
state.typeTable 设置为 typeTable。
state.registryEntryId 设置为 registryEntryId。
state 设置为把 state 传递给
6.2.1
初始化转换算法所得的结果。
output 设置为把 state 和
jsonldDocument
作为 inputDocuments 传递给 6.2.2 转换文档算法所得的结果。
suffix 设置为 output 的 CBOR 编码。
suffix 设置为 jsonldDocument 的 CBOR 编码。
cborldBytes 设置为在 suffix 前添加 prefix
后所得内容的十六进制编码。
cborldBytes。
此算法接受一个 CBOR-LD 载荷 cborldBytes,并返回一个 JSON-LD 文档
jsonldDocument。
state 设置为空映射。
result 设置为把 cborldBytes 传递给
6.6.2 获取
注册表条目 ID 算法所得的结果。
state.registryEntryId 设置为
result.registryEntryId,并将 suffix 设置为
result.suffix。
state.registryEntryId 关联的注册表条目使用
语义压缩:
state.strategy 设置为 "decompression"。
registryEntryId 关联的 CBOR-LD 注册表条目的
typeTables 数组中的每个条目 type: map,
将该条目添加到
state.typeTable,并将 state.reverseTypeTable
中 type 的值设置为 inverseMap,其中
inverseMap 是映射关系反转后的 map。
state 设置为把 state 传递给
6.2.1
初始化转换算法所得的结果。
input 设置为解码 suffix。如果结果不是映射或数组,则抛出错误
ERR_INVALID_PAYLOAD_STRUCTURE`。
jsonldDocument 设置为把 state 和
input 作为 inputDocuments
传递给 6.2.2
转换文档算法所得的结果。
jsonldDocument 设置为将 suffix 从
字节解码为映射所得的结果。
jsonldDocument。
本节中的算法描述了用于抽象地 在数据形式之间转换输入的“转换器”的行为。当与“策略”结合使用时, 例如本节后面定义的“压缩”和“解压缩”策略, 可以实例化这些算法以在具体的数据形式之间进行转换。 “压缩”策略从 JSON-LD 转换为 CBOR-LD,而“解压缩” 策略从 CBOR-LD 转换为 JSON-LD。
此算法接受并返回一个映射 state。
state 设置为把 state 传递给
6.4.1
初始化上下文加载器算法所得的结果。
state.initialActiveContext 设置为把空映射
termMap 和
previousActiveContext 传递给 6.3.1 初始化活动上下文算法所得的结果。
state.typesEncodedAsBytes 设置为空集合。
state.typesEncodedAsBytes。
state。
此算法接受映射 state 和一个映射或映射
数组 inputDocuments,并分别返回一个映射或
映射数组 outputMaps。
inputDocuments 是数组,则将 inputs 设置为
inputDocuments。否则,将 inputs
设置为 [inputDocuments]。
outputMaps 设置为空数组。
inputs 中的 input:
output 设置为空映射。
result 设置为把 state、input、
output 和
state.initialActiveContext(作为 activeContext)传递给
6.2.3
通用转换算法所得的结果。
result.output 添加到 outputMaps。
state 设置为 result.state。
inputDocuments 是数组,则返回 outputMaps。否则,返回
outputMaps 的
第一个元素。
此算法接受映射 input、output、state 和
activeContext
作为输入,并返回一个包含映射 state 和 output 的映射。
state.strategy 设置为 "compression":
contextConversionResult 设置为
6.2.5.1 用于压缩的上下文转换算法的结果,并传递
state、activeContext、input 和
output。
activeContext 设置为 contextConversionResult.activeContext,
将 output
设置为 contextConversionResult.output,并将 state 设置为
contextConversionResult.state。
activeContext 设置为
result.activeContext,将 output 设置为 result.output,并将
state 设置为 result.state,其中 result 是
6.2.6.1 用于解压缩的上下文转换算法的结果,并传递
state、
activeContext、input 和 output。
state.strategy 设置为 "compression",则将
objectTypes 设置为
6.2.5.4
获取用于压缩的对象类型算法的结果,并传递 activeContext
和 input。
objectTypes 设置为
6.2.6.4 获取用于解压缩的对象类型算法的结果,
并传递 state、activeContext 和 input。
activeContext 设置为把 activeContext 和
objectTypes 传递给
6.3.4
应用类型作用域上下文算法所得的结果。
state.strategy 设置为 "compression",则将
termEntries 设置为
6.2.5.3 获取用于压缩的输入条目算法的结果,并传递
state、
input 和 activeContext。
termEntries 设置为
6.2.6.3 获取用于解压缩的输入条目算法的结果,
并传递 state、input、output 和 activeContext。
termEntries 中的 [termInfo, value]:
term 设置为 termInfo.term。
valueActiveContext 设置为把 activeContext
和 term 传递给
6.3.3 应用属性作用域上下文算法所得的结果。
plural 设置为 termInfo.plural 的值,并将
termType 设置为 termInfo.def
中 @type 的值。
plural 设置为 true,则将 values 设置为
value 的值。否则,将 values 设置为
一个仅包含 value 值作为单个元素的数组。
outputs 设置为空数组。
values 中的 unconvertedValue:
result 设置为 6.2.4 转换值算法的结果,
并传递 state、termType、作为 value 的
unconvertedValue,以及作为 activeContext 的
valueActiveContext。
state 设置为 result.state,并将
result.output 添加到 outputs。
plural 设置为 true,则将 outputValues 设置为
outputs。否则,将 outputValues
设置为 outputs 的第一个元素。
state.strategy 设置为 "compression",则在 output 中将
termInfo.termId 的值映射到
outputValues。否则,在 output 中将
termInfo.term 的值映射到 outputValues。
result 设置为空映射。
result.state 设置为 state,并将 result.output 设置为
output。
result。
此算法接受映射 state、activeContext、termInfo,以及
值 value 和 termType。
它返回一个包含映射 state 和 output 的 result 对象。
value 是 null,则返回 null。
state.strategy 设置为 "compression",则将 output 设置为
把 state、termType、
termInfo 和 value 传递给 6.2.5.2
用于压缩的值转换算法所得的结果。
output 设置为把 state、
termType、
termInfo 和 value 传递给 6.2.6.2
用于解压缩的值转换算法所得的结果。
output 已定义,则返回 result,即一个包含
state 和 output 的映射。
value 是数组:
outputs 设置为空数组。
value 中的 element:
result 为 6.2.4 转换值算法的结果,
并传递 activeContext、state、
termInfo、termType,以及作为
value 的 element。将 state 设置为
result.state,并将
result.output
添加到 outputs。
result 设置为空映射。将 result.state
设置为 state,并将 result.output 设置为
outputs。
result。
output 设置为空映射。
result 设置为 6.2.3 通用转换算法的结果,并传递
state、
activeContext、作为 input 的 value,以及 output。
result。
本节中的算法定义了“压缩”策略, 该策略与前面定义的“转换”算法一起使用,以 将 JSON-LD 转换为 CBOR-LD。
此算法接受映射 state、activeContext、input
和 output,
并返回一个包含映射 output、state
和 activeContext 的映射 result。
applyEmbeddedResult 设置为 6.3.2
应用嵌入上下文算法的结果,
并传递 state、activeContext 和 input。
activeContext 设置为 applyEmbeddedResult.activeContext,并将
state 设置为
applyEmbeddedResult.state。
input 中没有 "@context" 条目:
result 设置为空映射。
result.state 设置为 state,并将
result.activeContext 设置为 activeContext。
result。
context 设置为 input 中 "@context" 的值。
encodedContexts 设置为空数组。
context 是数组,则将 isArray 设置为 true,并将
contexts 设置为 context。
否则,将 isArray 设置为 false,并将 contexts 设置为
[context]。
contexts 中的 contextValue:
encoderData 设置为 6.5.1.1 创建上下文编码器的结果,
并传递
state.typeTable 和 contextValue。
encoderData 是空映射,则将 contextValue 添加到
encodedContexts。
encoderData 的值添加到
encodedContexts。
isArray 为 true,则将 id 设置为
state.keywordsMap 中 "@context" 的值加 1,
并将 output 中 id 的值设置为 encodedContexts。
id 设置为 state.keywordsMap 中 "@context" 的值,
并将 output 中
id 的值设置为 encodedContexts 的第一个元素。
result.output 设置为 output,将 result.state 设置为
state,并将 result.activeContext
设置为 activeContext。
result。
此算法接受映射 state 和 termInfo,以及值
valueToEncode 和 termType,
并返回映射 encoderData。
valueToEncode 是对象,则返回。
result 设置为 6.5.2.1 创建值编码器的结果,并传递
state、termInfo、valueToToEncode 和
termType。
result。
此算法接受映射 state、activeContext 和
input,并返回数组 entries。
entries 初始化为空数组。
keys 设置为 input 的键,并按字典顺序排序。
keys 中的 key:
key 是 "@context",则继续。
value 设置为 input 中 key 的值。
value 是数组,则将 plural 设置为 true。
否则,将 plural 设置为 false。
key 在
state.termToId 中没有条目,则将 termId 设置为
key。
plural 为 true,则将 termId 设置为
state.termToId 中 key 的值加 1。
termId 设置为
state.termToId 中 key 的值。
activeContext.termMap 中有
key 的条目,则将 definition 设置为
activeContext.termMap 中 key 的值。否则,将
definition 设置为空映射。
entryTerm 设置为新映射。
entryTerm 中 "term" 的值设置为
key 的值。将 entryTerm 中 "def" 的值设置为
definition 的值。将 termId 和 plural
添加到 entryTerm。
entryTerm 和
value 的数组 entry。
entry 添加到 entries。
entries。
此算法接受映射 activeContext 和 input,并返回集合
objectTypes。
objectTypes 设置为空集合。
activeContext.typeTerms 中的 term:
term 在 input 中有条目:
types 设置为 input 中
term 的值。
types 中的每个值添加到 objectTypes。
objectTypes。
本节中的算法定义了“解压缩”策略, 该策略与前面定义的“转换”算法一起使用,以 将 CBOR-LD 转换为 JSON-LD。
此算法接受映射 state、activeContext、input
和 output,并返回一个
包含映射 output、state 和
activeContext 的映射 result。
decoderData 设置为 6.5.1.3 创建上下文解码器的结果,并传递
state.reverseTypeTable。
contextTermId 设置为
state.keywordsMap 中 "@context" 的值。
contextTermId 在 input 中有条目,则将
output 中 "@context" 的值设置为 6.5.1.4 解码上下文的结果,并传递
decoderData 和
input 中 contextTermId 的值作为 value。
contextTermIdPlural 设置为 contextTermId 的值加 1。
contextTermIdPlural 在 input 中有条目:
contextTermId 也在 input 中有条目,则抛出
ERR_INVALID_ENCODED_CONTEXT 错误。
encodedContexts 设置为 input 中
contextTermIdPlural 的值。如果 encodedContexts
不是数组,则抛出 ERR_INVALID_ENCODED_CONTEXT 错误。
contexts 设置为空数组。
encodedContexts 中的每个 valueToDecode,将
decoderData 和作为 value 的 valueToDecode
传递给 6.5.1.4
解码上下文所得的结果添加到 contexts。
output 中 "@context" 的值设置为 contexts。
embeddedContextResult 设置为 6.3.2
应用嵌入上下文算法的结果,并传递
activeContext、作为 input 的 output 和
state。
result 设置为 embeddedContextResult,并将 result.output
设置为 output。返回 result。
此算法接受映射 state 和 termInfo,以及值
termType 和 valueToDecode,并返回值
decodedValue。
value 是映射,则返回。
decoderData 设置为 6.5.2.3 创建值解码器的结果,并传递
valueToDecode、
state、termInfo 和 termType。
decodedValue 设置为 6.5.2.4 解码值的结果,并传递 decoderData。
decodedValue。
此算法接受映射 state、activeContext 和
input,并返回数组
entries。
entries 初始化为空数组。
input 中的键值对 key 和 value:
key 是
state.keywordsMap 中 "@context" 的值或该值加 1,则继续。
key 是字符串,则将 plural 设置为 false,并将
term 设置为 key。
key 是奇数,则将 plural 设置为 true。否则,将
plural 设置为 false。
plural 为 true,则将 term 设置为
state.idToTerm 中
key 减 1 所对应的值。
如果该值没有条目,则抛出错误
ERR_UNKNOWN_CBORLD_TERM_ID。
term 设置为
state.idToTerm 中 key 的值。如果该值
没有条目,则抛出错误 ERR_UNKNOWN_CBORLD_TERM_ID。
definition 设置为
activeContext.termMap 中 term 的值。
entryTerm 设置为新映射。
entryTerm 中 "termId" 的值设置为
key 的值。将 entryTerm 中 "def" 的值设置为
definition 的值。将 term 和 plural
添加到 entryTerm。
entryTerm 和
value 的数组 entry。
entry 添加到 entries。
entries 的每个元素中 term 的值对
entries 进行排序。
entries。
此算法接受映射 state、activeContext、input 作为
输入,并
返回集合 objectTypes。
objectTypes 设置为空集合。
activeContext.typeTerms 中的 term:
term 在
state.termToId 中没有条目,则将 termId 设置为
term。
termId 设置为
state.termToId 中 term 的值。
input 中既不存在 termId,也不存在
termId 加 1,则继续。
termId 存在于 input 中,则将
value 设置为 input 中 termId 的值。
value 设置为 input 中
termId 加 1 所对应的值。
key 是字符串,则将 plural 设置为 false,并将
term 设置为 key。
key 是奇数,则将 plural 设置为 true。否则,将
plural 设置为 false。
plural 为 true,则将 term 设置为
state.idToTerm 中
id 减 1 所对应的值。
如果该值没有条目,则抛出错误
ERR_UNKNOWN_CBORLD_TERM_ID。
term 设置为
state.idToTerm 中 id 的值。如果该值
没有条目,则抛出错误 ERR_UNKNOWN_CBORLD_TERM_ID。
definition 设置为
activeContext.termMap 中 term 的值。
termInfo 设置为新映射。
entryTerm 中 "def" 的值设置为
definition 的值。将 term、termId 和
plural 添加到 termInfo。
value 不是数组,则将 values 设置为一个
仅包含 value 作为单个元素的数组。
否则,将 values 设置为 value 的值。
values 中的每个 value:
decoderData 设置为 6.5.2.3
创建值解码器的结果,并传递 value、
termInfo、state,以及作为
termType 的 "@vocab"。
decoderData 存在,则将 6.5.2.4
解码值的结果(传递 decoderData)添加到
`objectTypes。
value 添加到 objectTypes。
objectTypes。
本节中的算法描述如何确定 与 JSON-LD 文档关联的上下文文档中的哪些组成部分 在压缩或解压缩过程中的任意时刻正在使用。 这些算法包括如何在 CBOR-LD 中应用嵌入式上下文、类型作用域上下文和 属性作用域上下文。这与本规范后面定义的上下文 加载算法形成对比,后者描述如何 构建从术语到整数的映射,而这些映射正是 CBOR-LD 压缩技术的核心。活动上下文处理算法和上下文 加载算法共同规定在 与 CBOR-LD 相互转换时应如何处理 JSON-LD 上下文文档。
此算法接受映射 previousActiveContext 和 termMap,
并返回映射 activeContext。它更新当前正在使用的活动上下文,
并查找 '@type' 的所有别名。
activeContext 设置为一个新映射。
activeContext.previousActiveContext 设置为 previousActiveContext。
activeContext.termMap 设置为 termMap。
activeContext.typeTerms 设置为数组 ['@type']。
termMap 中的 [term, def]:
def 中 "@id" 的值是 "@type",则将 term 添加到
activeContext.typeTerms。
activeContext。
此算法接受映射 state、activeContext 和 input 作为
输入,并
返回包含映射 state 和 activeContext 的映射 result。
termMapUpdateResult 设置为把 state、
作为 activeTermMap 的 activeContext.termMap,以及 input 中
'@context' 的值作为 contexts 传递给
6.3.5 更新术语
映射算法所得的结果。
state 设置为 termMapUpdateResult.state。
termMap 设置为 termMapUpdateResult.activeTermMap。
newActiveContext 设置为 6.3.1
初始化活动上下文算法的结果,
并传递 termMap 和作为
previousActiveContext 的 activeContext。
result 设置为一个新映射,并将 result.activeContext 设置为
newActiveContext,将
result.state 设置为 state。
result。
此算法接受映射 state、activeContext 和字符串
term 作为输入,并
返回包含映射 state 和 activeContext 的映射 result。
revertedTermMap 设置为 6.3.6 还原术语映射算法的结果,
并传递 activeContext。
termDef 设置为 activeContext.termMap 中
term 的值。将 contexts 设置为
termDef 中 "@context" 的值。
termMapUpdateResult 设置为把 state、
作为 activeTermMap 的 revertedTermMap、作为
propertyScope 的 true,以及
contexts 传递给
6.3.5 更新术语
映射算法所得的结果。
state 设置为 termMapUpdateResult.state。
termMap 设置为 termMapUpdateResult.activeTermMap。
newActiveContext 设置为 6.3.1
初始化活动上下文算法的结果,
并传递 termMap 和作为
previousActiveContext 的 activeContext。
result 设置为一个新映射,并将 result.activeContext 设置为
newActiveContext,将
result.state 设置为 state。
result。
此算法接受映射 state、activeContext 和集合
objectTypes 作为输入,并
返回包含映射 state 和 activeContext 的映射 result。
objectTypesSorted 设置为空数组。
objectTypes 的元素进行排序,并按顺序将这些元素添加到
objectTypesSorted。
newTermMap 设置为 activeContext.termMap。
objectTypesSorted 中的 type:
typeDef 设置为 newTermMap 中 type 的值。
将 contexts 设置为
typeDef 中 "@context" 的值。
termMapUpdateResult 设置为把 state、
作为 activeTermMap 的 newTermMap、contexts,以及作为
typeScope 的 true 传递给
6.3.5
更新术语映射算法所得的结果。
state 设置为 termMapUpdateResult.state,并将
newTermMap 设置为
termMapUpdateResult.activeTermMap。
newActiveContext 设置为 6.3.1
初始化活动上下文算法的结果,
并传递作为 termMap 的 newTermMap 和作为
previousActiveContext 的 activeContext。
result 设置为一个新映射,并将 result.activeContext 设置为
newActiveContext,将
result.state 设置为 state。
result。
此算法接受映射 state、activeTermMap 和值
contexts,以及布尔值 typeScope
和 propertyScope 作为输入;如果未提供,这两个布尔值均默认为 false。
它返回映射 state
和 activeTermMap。
contexts 不是数组,则将 contexts 设置为一个数组,并以
contexts 之前的值
作为其唯一元素。
allowProtectedOverride 设置为 propertyScope 的值。
propagateDefault 设置为 typeScope 值的逻辑非。
contexts 中的 contextIdentifier:
loadResult 设置为 6.4.2 加载上下文算法的结果,并传递
state 和
contextIdentifier。
entry 设置为 loadResult.entry,
将 context 设置为 entry.context,并将
state 设置为 loadResult.state。
@propagate 出现在 context 中,则将 propagate
设置为 context 中 @propagate 的值。
否则,将 propagate 设置为 propagateDefault 的值。
newTermMap 设置为空映射。对于 entry.termMap 中的
[key,
value]:
value 的内容浅复制到一个新映射
newValue 中,并将 propagate
添加到 newValue。
newTermMap 中 key 的值设置为
newValue。
activeTermMap 中的 [term, activeDef]:
def 为 newTermMap 中
term 的值。
def 已定义:
activeDef 中 protected 的值为
true:
allowProtectedOverride 设置为
false,且 def 与
activeDef 不完全相同,
则抛出错误 ERR_PROTECTED_TERM_REDEFINITION。
newTermMap 中 term 的值
设置为一个包含 activeDef
中各值的映射,并将 propagate 设置为
def.propagate 的值。
term 出现在 context 中,则将
newTermMap 中 term 的值设置为
一个包含 activeDef 中所有值的映射。
activeTermMap 的值设置为 newTermMap 的值。
result 设置为空映射。
result.state 设置为 state,并将
result.activeTermMap 设置为 activeTermMap。
result。
此算法接受映射 activeContext 作为输入,并返回映射
newTermMap。
newTermMap 设置为空映射。
nonPropagatingTerms 设置为空数组。
activeContext 中的 [term, def]:
def.propagate 设置为 false,则将 term 添加到
nonPropagatingTerms
并继续此循环的下一次迭代。
newTermMap 中 term 的值设置为
def。
nonPropagatingTerms 中的 term:
currentContext 设置为 activeContext.previousActiveContext。
def 设置为
currentContext.termMap 中 term 的值。
def 不是 undefined 且 def.propagate 设置为
false 时:
currentContext 设置为
activeContext.previousActiveContext。
def 设置为
currentContext.termMap 中 term 的值。
def 不是 undefined,则将 newTermMap 中
term 的值设置为 def。
newTermMap。
本节中的算法定义如何构建 术语与整数之间的映射,这些映射被用作 CBOR-LD 的核心压缩技术。
此算法接受并返回映射 state。
state.contextMap 设置为一个新映射。
state.nextTermId 设置为 100。
state.keywordsMap 设置为以下 JSON-LD 关键词到其关联
整数值的映射:
{
'@context' => 0,
'@type' => 2,
'@id' => 4,
'@value' => 6,
'@direction' => 8,
'@graph' => 10,
'@included' => 12,
'@index' => 14,
'@json' => 16,
'@language' => 18,
'@list' => 20,
'@nest' => 22,
'@reverse' => 24,
'@base' => 26,
'@container' => 28,
'@default' => 30,
'@embed' => 32,
'@explicit' => 34,
'@none' => 36,
'@omitDefault' => 38,
'@prefix' => 40,
'@preserve' => 42,
'@protected' => 44,
'@requireAll' => 46,
'@set' => 48,
'@version' => 50,
'@vocab' => 52,
'@propagate' => 54
}
state.keywordsMap 中的每个条目添加到 state.termToId。
state.strategy 设置为 "decompression",则将 state.idToTerm 设置为
state.termToId 的反向映射
(即从整数到 JSON-LD 关键词的映射)。
state。
此算法接受映射 state 和上下文映射或 URL
contextIdentifier,并返回
result,即一个包含映射 state 和 entry 的映射。
state.contextMap 中存在 contextIdentifier 的条目:
result 初始化为空映射。
result.state 设置为 state。
result.entry 设置为
state.contextMap 中 contextIdentifier 的值。
result。
context 是字符串:
context 设置为该对象中
"@context" 的值。
contextUrl 设置为 contextIdentifier 的值。
context 设置为 contextIdentifier。
result 设置为 6.4.3 添加上下文算法的结果,并传递
state、context,以及已设置时的 contextUrl。
result。
此算法接受映射 state、上下文对象 context 和上下文
URL contextUrl,
并返回 result,即一个包含映射 state 和 entry 的映射。
context 中存在条目 "@import":
importUrl 设置为 `context 中 "@import" 的值。
state.contextMap 中不存在 importUrl 的条目:
importUrl 关联的上下文对象,并将
importContext 设置为该对象中
"@context" 的值。
importedContextAdditionResult 设置为 6.4.3
添加上下文算法的结果,
并传递 state、作为 context 的 importContext,
以及作为 contextUrl 的 importUrl。
state 设置为 importedContextAdditionResult.state,并将
importEntry 设置为
importedContextAdditionResult.entry。
importEntry 设置为
state.contextMap 中 importUrl 的值。
context 设置为一个包含 context 中所有条目以及
importEntry.context 中所有条目的映射。
termMap 设置为空映射。
entry 设置为一个包含 context 和 termMap 的对象。
sortedTerms 设置为按
字典顺序对 context 中的键排序所得的结果。
context 中存在 "@protected" 条目,则将 isProtected 设置为
true,否则设置为 false。
sortedTerms 中的 term:
term 在 state.keywordsMap 中存在条目,则继续此
循环的下一次迭代。
definition 设置为 context 中 term 的值。
definition 是 null,则继续此
循环的下一次迭代。
definition 是字符串:
newDefinition 设置为空映射。
newDefinition 中 "@id" 的值设置为 definition。
definition 的值设置为 newDefinition。
definition 中 protected 的值设置为
isProtected。
termMap 中 term 的值设置为 definition。
term 在 state.termToId 中不存在条目:
termId 设置为 state.nextTermId。
state.nextTermId 增加 2。
state.termToId 中 term 的值设置为
termId。
state.idToTerm 中 termId 的值设置为
term。
contextUrl 已定义,则将
state.contextMap 中 contextUrl 的值设置为 entry。
state.contextMap 中 context 的值
设置为 entry。
result 设置为空映射。
result.state 设置为 state,并将 result.entry 设置为
entry。
result。
本节中的编解码器精确定义了 JSON-LD 中的各个值应如何转换为 CBOR, 以及如何进行反向转换。它们由上一节中的算法使用,并使 CBOR-LD 能够 高效地 将基本类型和非基本类型编码为 CBOR。
此算法接受映射 typeTable 和值 contextValue,并
返回映射 encoderData。
encoderData 初始化为空映射。
contextValue 不是字符串,则返回。
contextTable 设置为
typeTable 中 "context" 的值。
encoderData.context 设置为 contextValue,并将
encoderData.contextTable 设置为
contextTable。
encoderData。
此算法接受映射 encoderData,并返回 CBOR 二进制数据。
encoderData.context 在
encoderData.contextTable 中有条目,则返回
encoderData 中 encoderData.context 的值的 CBOR 编码,
并将其作为主类型 0(无符号整数)对象。
encoderData.context 的值的 CBOR 编码,并将其作为主类型 3
(文本字符串)对象。
此算法接受映射 reverseTypeTable,并
返回映射 encoderData。
reverseContextTable 设置为
reverseTypeTable 中 "context" 的值。
decoderData 初始化为空映射。
decoderData.reverseContextTable 设置为
reverseContextTable 的值,并
返回 decoderData。
此算法接受映射 decoderData 和值 value,并返回
一个值。
value 不是数字,则返回 value。
decoderData.reverseContextTable 中有
value 的条目,则返回
该条目的值。
ERR_UNDEFINED_COMPRESSED_CONTEXT。
此算法接受映射 state 和 termInfo,以及值
termType 和 valueToEncode,并返回映射 encoderData
或 valueToEncode。
isUrl 设置为 false。
termInfo.term 是 "@id" 或 "@type",则将 isUrl 设置为
true。
termInfo.def 中 "@id" 的值是 "@id" 或 "@type",则将
isUrl 设置为 true。
termType 是 "@id" 或 "@vocab",则将 isUrl 设置为 true。
isUrl 为 true,则将 tableType 设置为 "url"。
termType 已定义,则将 tableType 设置为
termType。
tableType 设置为 "none"。
state.typeTable 中有 tableType 的条目:
subTable 设置为
state.typeTable 中 tableType 的值。
subTable 中有 valueToEncode 的条目:
intValue 设置为 subTable 中
valueToEncode 的值。将 includeSign 设置为
false。
state.typesEncodedAsBytes 中有
tableType 的条目,则将 convertToBytes 设置为
true。
否则,将 convertToBytes 设置为 false。
tableType 不是 "none" 且 valueToEncode
是整数:
intValue 设置为 valueToEncode 的值。
convertToBytes 和 includeSign 设置为
true。
intValue 已定义:
encoderData 初始化为空映射。
encoderData.intValue 设置为
intValue 的值,将
encoderData.convertToBytes
设置为
convertToBytes 的值,并将
encoderData.includeSign 设置为
includeSign 的值。
encoderData。
tableType 在 state.processingModeTypeEncoders 中有条目,则将
encoderData 设置为
调用与该条目的编解码器关联的 Create Encoder 算法所得的结果。
encoderData 已定义,则返回 encoderData。
valueToEncode。
此算法接受映射 encoderData,并返回 CBOR 二进制数据。
encoderData.convertToBytes 为 true:
bytes 设置为把 intValue 转换为字节所得的结果,
使用 includeSign 的值来
确定该整数的二进制表示应为有符号还是
无符号。
bytes 的 CBOR 编码,并将其作为主类型 2(字节字符串)对象。
intValue 的 CBOR 编码,并将其作为主类型 0(无符号
整数)对象。
此算法接受映射 state 和 termInfo,以及值
termType 和 valueToDecode,并返回映射
decoderData。
isUrl 设置为 false。
termInfo.term 是 "@id" 或 "@type",则将 isUrl 设置为
true。
termInfo.def 中 "@id" 的值是 "@id" 或 "@type",则将
isUrl 设置为 true。
termType 是 "@id" 或 "@vocab",则将 isUrl 设置为 true。
isUrl 为 true,则将 tableType 设置为 "url"。
termType 已定义,则将 tableType 设置为
termType。
tableType 设置为 "none"。
state.reverseTypeTable 中有 tableType 的条目:
subTable 设置为
state.reverseTypeTable 中 tableType 的值。
useTable 设置为 false。
valueToDecode 是字节数组,并且
state.typesEncodedAsBytes 中有
tableType 的条目:
useTable 设置为 true。
intValue 设置为
valueToDecode 字节转换为无符号整数所得的结果。
valueToDecode 是整数,并且
state.typesEncodedAsBytes 中
没有 tableType 的条目:
useTable 设置为 true。
intValue 设置为 valueToDecode。
useTable 为 true:
intValue 不在 subTable 中,则抛出错误
ERR_UNKNOWN_COMPRESSED_VALUE。
decoded 设置为 subTable 中
intValue 的值。
valueToDecode 是字节数组且 tableType
不是 "none",则将
decoded 设置为 valueToDecode 转换为整数所得的结果。
decoded 已定义,则将 decoderData 初始化为空
映射,将 decoderData.decoded 设置为
decoded 的值,并返回 decoderData。
tableType 在 state.processingModeTypeDecoders 中有条目,则将
DecoderData 设置为
调用与该条目的编解码器关联的 Create Decoder 算法所得的结果。
decoderData 已定义,则返回 decoderData。
valueToDecode 不是数组,则将
decoderData 初始化为空映射,将
decoderData.decoded 设置为 valueToDecode,并返回
decoderData。
此算法接受映射 decoderData,并返回一个值。
decoderData.decoded。
URL 编解码器根据值的前缀压缩 URL 值, 其中前缀是 URL 前缀 表中最长的匹配条目。URL 被编码为数组,其中第一个整数 标识 URL 的前缀。编解码器首先检查该值是否与已知的 JSON-LD 术语标识符匹配,如果匹配,则将其编码为一个简单整数。否则, 它会根据值的前缀委托给以下特定于前缀的子编解码器之一。
URL 前缀表将 URL 前缀映射到其 关联的压缩整数标识符。使用 URL 编解码器的实现必须使用下表。URL 前缀反向表是此表的 反向映射(即从整数到 URL 前缀字符串的映射)。
| URL 前缀 | 整数标识符 |
|---|---|
http:// |
1 |
https:// |
2 |
urn:uuid: |
3 |
data: |
4 |
did:v1:nym: |
1024 |
did:key: |
1025 |
此算法接受映射 state、映射 termInfo
和字符串 valueToEncode,并返回编码器对象
或 undefined。
valueToEncode 不是字符串,则抛出
ERR_UNSUPPORTED_JSON_TYPE 错误。
termId 设置为在
state.termToId 中查找 valueToEncode 所得的结果。
termId 是整数,则返回一个编码器,该编码器在通过
6.5.3.3 编码
URL 调用时,将 termId 编码为
主类型 0(无符号整数)CBOR 项。
valueToEncode 解析为 URL。
如果解析失败(即该值不是有效的 URL),则返回
undefined。
prefix 设置为 URL 前缀
表中的条目,
使得 valueToEncode 以 prefix 开头,并且
valueToEncode 中紧随 prefix 之后的其余部分
不包含 ":"(U+003A 冒号)字符。如果不存在这样的
条目,则返回 undefined(意味着此 URL
无法压缩)。
prefix 是 "https://" 或
"http://",则返回
6.5.3.6.1 创建
HTTP URL 编码器的结果,并传入
valueToEncode。
prefix 是 "urn:uuid:",则返回
6.5.3.7.1 创建
UUID URN 编码器的结果,并传入
valueToEncode。
prefix 是 "data:",则返回
6.5.3.8.1 创建
Data URL 编码器的结果,并传入
valueToEncode。
prefix 是 "did:v1:nym:" 或
"did:key:",则返回
6.5.3.9.1
创建 Base58 DID URL 编码器的结果,并传入
valueToEncode。
undefined(意味着此 URL 无法压缩)。
此算法接受由 6.5.3.2 创建 URL 编码器生成的编码器对象,并返回 CBOR 二进制数据。
termId 的 CBOR 编码,并将其作为主类型 0(无符号整数)对象。
encode 方法,并返回生成的 CBOR 二进制数据。
此算法接受映射 state、映射 termInfo
和值 valueToDecode,并返回解码器对象或
undefined。
valueToDecode 是字符串,则返回 undefined
(意味着该值已经是未压缩的 URL 字符串;直接传递)。
valueToDecode 是数组:
prefixId 设置为
valueToDecode 的第一个元素。
prefix 设置为 URL 前缀
反向表中与 prefixId 对应的值。
prefix 是 "http://" 或
"https://",则将 decoder 设置为
6.5.3.6.3
创建 HTTP URL 解码器的结果,并传入
valueToDecode。
prefix 是 "urn:uuid:",则将
decoder 设置为
6.5.3.7.3
创建 UUID URN 解码器的结果,并传入
valueToDecode。
prefix 是 "data:",则将
decoder 设置为
6.5.3.8.3
创建 Data URL 解码器的结果,并传入
valueToDecode。
prefix 是 "did:v1:nym:" 或
"did:key:",则将 decoder 设置为
6.5.3.9.4 创建 Base58 DID URL 解码器的结果,并传入
valueToDecode。
prefix 与以上任何一项都不匹配(包括
prefixId 在
URL 前缀反向表中没有条目的情况),或者
decoder 为
undefined(意味着子解码器拒绝了
valueToDecode 的结构),则抛出
ERR_UNKNOWN_COMPRESSED_VALUE 错误。
decoder。
valueToDecode 是整数,则将 term 设置为
在 state.idToTerm 中查找 valueToDecode 所得的
结果,并返回一个解码器,其
6.5.3.5 解码 URL
调用返回 term。
undefined。
此算法接受由 6.5.3.4 创建 URL 解码器生成的解码器对象,并返回字符串值。
term 字符串。
decode 方法,并返回生成的字符串。
HTTP URL 编解码器处理前缀为
http:// 或 https:// 的值。编码后的 HTTP URL
表示为双元素 CBOR 数组
[prefixId, remainder],其中 prefixId 是
URL 前缀表中的整数,而 remainder 是
URL 去除前缀后的部分,以文本字符串表示。
此算法接受字符串 value,并返回
编码器对象或 undefined。
value 以 "https://" 开头,则将
prefix 设置为 "https://"。
value 以 "http://" 开头,则将
prefix 设置为 "http://"。
undefined。
value 和
prefix 的编码器对象。
此算法接受来自 6.5.3.6.1 创建 HTTP URL 编码器的编码器对象,并返回 CBOR 二进制数据。
prefixId 设置为 URL 前缀表中
encoderData.prefix
的值。
rest 设置为 encoderData.value 中
从 encoderData.prefix 之后开始的子字符串。
[prefixId, rest] 的 CBOR 编码:主类型 4(数组),包含一个
主类型 0(无符号整数)项,后跟一个主类型 3
(文本字符串)项。
此算法接受 CBOR 数组 valueToDecode,并
返回解码器对象或 undefined。
valueToDecode 恰好有两个元素,并且第二个
元素是文本字符串:
prefix 设置为 URL 前缀
反向表中 valueToDecode[0] 的值。
prefix 的解码器对象。
undefined。
此算法接受来自
6.5.3.6.3 创建
HTTP URL 解码器的解码器对象和 CBOR 数组
valueToDecode,并返回字符串。
decoderData.prefix 与
valueToDecode[1] 拼接后的结果。
UUID URN 编解码器处理前缀为
urn:uuid: 的值。编码后的 UUID URN 是一个双元素 CBOR 数组
[3, uuidValue],其中 uuidValue 可以是
表示 UUID 二进制形式的 16 字节主类型 2(字节字符串)
(当 UUID 字符串全部为小写时),也可以是包含 UUID 原始值的
主类型 3(文本字符串)(当大小写无法通过
二进制形式往返还原时)。
此算法接受字符串 value,并返回编码器
对象或 undefined。
value 不以 "urn:uuid:" 开头,
则返回 undefined。
value 的编码器对象。
此算法接受编码器对象,并返回 CBOR 二进制数据。
prefixId 设置为 3(即
URL 前缀表中
"urn:uuid:" 的条目)。
rest 设置为 encoderData.value 中
从 "urn:uuid:" 之后开始的子字符串。
rest 不包含大写字符(即它
与其小写形式相等):
uuidBytes 设置为通过按照
[RFC4122]
解析 rest 获得的 UUID 的 16 字节二进制表示。
如果 rest 无法解析为有效的 UUID,则
抛出错误并且编码失败。
[3, uuidBytes] 的 CBOR 编码:主类型 4(数组),包含一个
主类型 0(无符号整数)项,后跟一个长度为 16 的主类型 2
(字节字符串)项。
[3, rest] 的 CBOR 编码:主类型 4(数组),包含一个
主类型 0(无符号整数)项,后跟一个主类型 3
(文本字符串)项。
此算法接受 CBOR 数组 valueToDecode,并返回
解码器对象或 undefined。
valueToDecode 恰好有两个元素,并且第二个
元素是字节字符串或文本字符串,则返回解码器对象。
undefined。
此算法接受解码器对象和 CBOR 数组
valueToDecode,并返回字符串。
valueToDecode[1] 是文本字符串,则将 uuid
设置为 valueToDecode[1]。
uuid 设置为按照 [RFC4122]
得到的 16 字节二进制值 valueToDecode[1] 的 UUID 字符串表示
(小写、以连字符分隔的形式)。
"urn:uuid:" 与
uuid 拼接后的结果。
Data URL 编解码器处理前缀为
data: 的值(data URL,如 [RFC2397] 中所定义)。
Base64 编码的 data URL
(匹配 data:<mediatype>;base64,<data>)被
编码为三元素 CBOR 数组
[4, mediatype, dataBytes]。非 base64 data URL 被编码
为双元素 CBOR 数组 [4, rest],其中
rest 是 URL 中 "data:" 之后的部分。
此算法接受字符串 value,并返回编码器
对象或 undefined。
value 不以 "data:" 开头,则返回
undefined。
^data:(?<mediatype>.*);base64,(?<data>.*)$
匹配 value,
其中每个 .* 都是贪婪的(即,如果字符串
";base64," 出现多次,则
mediatype 组扩展到最后一次出现的位置)。
data 设置为 data 捕获
组的值。
data 从 base64 解码,然后
再重新编码为 base64。如果结果等于 data,则返回一个
编码器对象,其中 value 和 base64 被设置为
true。
value 和 base64
被设置为 false。
此算法接受来自 6.5.3.8.1 创建 Data URL 编码器的编码器对象,并返回 CBOR 二进制数据。
prefixId 设置为 4(即
URL 前缀表中
"data:" 的条目)。
encoderData.base64 为 true:
encoderData.value 以提取 mediatype
("data:" 与 ";base64," 之间的子字符串)
和 dataBytes(base64 数据
部分的二进制解码结果)。
[prefixId, mediatype, dataBytes] 的 CBOR 编码:主类型 4(数组),
包含一个主类型 0 整数、一个主类型 3 文本字符串和一个
主类型 2 字节字符串。
rest 设置为 encoderData.value 中
从 "data:" 之后开始的子字符串。
[prefixId, rest] 的 CBOR 编码:主类型 4(数组),包含一个
主类型 0 整数和一个主类型 3 文本字符串。
此算法接受 CBOR 数组 valueToDecode,并返回
解码器对象或 undefined。
valueToDecode 恰好有三个元素,第二个
元素是文本字符串,并且第三个元素是字节字符串,则返回
解码器对象(base64 模式)。
valueToDecode 恰好有两个元素,并且
第二个元素是文本字符串,则返回解码器对象
(非 base64 模式)。
undefined。
此算法接受解码器对象和 CBOR 数组
valueToDecode,并返回字符串。
valueToDecode 有三个元素(base64 模式):
mediatype 设置为 valueToDecode[1]。
encodedData 设置为字节字符串
valueToDecode[2] 的 base64 编码。
"data:"、
mediatype、";base64," 和
encodedData 拼接后的结果。
"data:" 与 valueToDecode[1] 拼接后的结果。
Base58 DID URL 编解码器处理前缀为
did:v1:nym: 或 did:key: 的 DID URL,并且其
authority(以及可选的 fragment)组成部分通常是 multibase
base58btc 编码字符串(即以字符
'z' 开头的字符串)。压缩后的 DID URL 被编码为双元素或
三元素 CBOR 数组 [prefixId, authority] 或
[prefixId, authority, fragment]。当某个组成部分以
'z' 开头并且是有效的 base58btc 时,它会以原始字节
字符串形式存储;否则以文本字符串形式存储。
此算法接受字符串 value,并返回
编码器对象或 undefined。
"did:" 开头的每个 [prefix, prefixId] 对:
value 以 prefix 开头,则返回一个
包含 value、prefix 和
prefixId 的编码器对象。
undefined。
此算法接受来自 6.5.3.9.1 创建 Base58 DID URL 编码器的编码器对象,并返回 CBOR 二进制 数据。
suffix 设置为 encoderData.value 中
从 encoderData.prefix 之后开始的子字符串。
'#' 第一次出现的位置拆分 suffix,
以生成 authority 以及存在时的
fragment。
authorityEncoded 设置为把
Multibase Base58 到 CBOR 令牌
算法应用于
authority 所得的结果。
entries 初始化为
[encoderData.prefixId, authorityEncoded]。
fragment 已定义:
fragmentEncoded 设置为把
Multibase Base58 到 CBOR
令牌算法应用于
fragment 所得的结果。
fragmentEncoded 追加到 entries。
entries 的 CBOR 编码,并将其作为主类型 4
(数组)。
Multibase Base58 到 CBOR 令牌算法接受字符串
str,并返回主类型 2(字节字符串)CBOR
令牌(如果该值是 base58btc multibase 字符串)或主类型 3
(文本字符串)CBOR 令牌。
str 以 'z' 开头:
decoded 设置为解码 str 的 base58btc 内容
(即 str[1:])所得的结果。
decoded 的主类型 2(字节字符串)CBOR 令牌。
str 的主类型 3(文本字符串)CBOR 令牌。
此算法接受 CBOR 数组 valueToDecode,并返回
解码器对象或 undefined。
valueToDecode 恰好有两个或三个元素:
prefix 设置为 URL 前缀
反向表中 valueToDecode[0] 的值。
prefix 的解码器对象。
undefined。
此算法接受来自
6.5.3.9.4
创建 Base58 DID URL 解码器的解码器对象和 CBOR 数组
valueToDecode,并返回字符串。
url 设置为 decoderData.prefix。
valueToDecode[1] 是字节字符串,则向
url 追加 'z',后跟
valueToDecode[1] 的 base58btc 编码。
valueToDecode[1] 追加到 url。
valueToDecode 有两个以上的元素:
valueToDecode[2] 是字节字符串,则向
url 追加 "#z",后跟
valueToDecode[2] 的 base58btc 编码。
url 追加 "#",后跟
valueToDecode[2]。
url。
XSD Date 编解码器压缩类型为
http://www.w3.org/2001/XMLSchema#date 的值。日期值
表示为自 Unix 纪元
(1970-01-01T00:00:00Z)以来的秒数整数,对于非负值编码为 CBOR 主类型 0(无符号
整数),对于纪元之前的日期编码为主类型 1(负整数)。
该编解码器仅压缩能够通过此表示
完全往返转换的日期字符串;否则将逐字保留原始
字符串。
此算法接受字符串 value,并返回编码器
对象或 undefined。
value 包含字符 'T'(表示
时间组成部分),则返回 undefined(该值改由
XSD DateTime
编解码器压缩)。
parsed 设置为把 value 解析为
ISO 8601 日期字符串所得的结果,并以自
Unix 纪元以来的毫秒数表示。
parsed 不是有效数字,则返回
undefined。
value 和
parsed 的编码器对象。
此算法接受来自 6.5.4.1 创建 XSD Date 编码器的编码器对象,并返回 CBOR 二进制数据。
secondsSinceEpoch 设置为
floor(encoderData.parsed / 1000)。
reconstituted 设置为自 Unix
纪元以来 secondsSinceEpoch × 1000 毫秒处时间点的 ISO 8601 字符串。
expectedDate 设置为
reconstituted 中第一次出现
'T' 之前的子字符串。
encoderData.value 不等于
expectedDate,则压缩将是有损的。返回
encoderData.value 的 CBOR 编码,并将其作为主类型 3(文本
字符串)对象。
secondsSinceEpoch 大于或等于
0,则返回
secondsSinceEpoch 的 CBOR 编码,并将其作为主类型 0(无符号整数)
对象。
secondsSinceEpoch 的 CBOR 编码,
并将其作为主类型 1(负整数)对象。
此算法接受值 valueToDecode,并返回
解码器对象或 undefined。
valueToDecode 是整数(正数、负数或
零),则返回解码器对象。
undefined。
此算法接受解码器对象和整数值
value,并返回字符串。
dateString 设置为自 Unix 纪元以来
value * 1000 毫秒处时间点的 ISO 8601 字符串。
dateString 中第一次
出现 'T' 之前的子字符串。
XSD DateTime 编解码器压缩类型为
http://www.w3.org/2001/XMLSchema#dateTime 的值。精确到秒的
日期时间值被编码为自
Unix 纪元以来的单个秒数整数(主类型 0 或 1)。精确到秒以下的日期时间值
被编码为双元素 CBOR 数组 [seconds,
milliseconds],两者均作为主类型 0 整数。与 XSD
Date 编解码器一样,仅当压缩无损时才压缩该值
(原始字符串能够通过编码完全往返转换)。
此算法接受字符串 value,并返回编码器
对象或 undefined。
value 不包含字符 'T',
则返回 undefined(该值改由
XSD Date 编解码器压缩)。
parsed 设置为把 value 解析为
ISO 8601 日期时间字符串所得的结果,并以自
Unix 纪元以来的毫秒数表示。
parsed 不是有效数字,则返回
undefined。
value 和
parsed 的编码器对象。
此算法接受来自 6.5.5.1 创建 XSD DateTime 编码器的编码器对象,并返回 CBOR 二进制 数据。
secondsSinceEpoch 设置为
floor(encoderData.parsed / 1000)。
encoderData.value 不包含字符
'.'(没有毫秒组成部分):
expectedDate 设置为自 Unix
纪元以来 secondsSinceEpoch * 1000 毫秒处时间点的 ISO 8601 字符串,并将子字符串
".000Z" 替换为
"Z"。
encoderData.value 不等于
expectedDate,则压缩将是有损的。返回
encoderData.value 的 CBOR 编码,并将其作为主类型 3
(文本字符串)对象。
secondsSinceEpoch 大于或等于
0,则返回
secondsSinceEpoch 的 CBOR 编码,并将其作为主类型 0(无符号整数)
对象。
secondsSinceEpoch 的 CBOR 编码,并将其作为
主类型 1(负整数)对象。
millisecondIndex 设置为
encoderData.value 中第一个 '.' 的索引。
milliseconds 设置为
encoderData.value 中从位置
millisecondIndex + 1 开始的数字所表示的整数值。
expectedDate 设置为自 Unix 纪元以来
secondsSinceEpoch * 1000 + milliseconds 毫秒处时间点的 ISO 8601 字符串。
encoderData.value 不等于
expectedDate,则压缩将是有损的。返回
encoderData.value 的 CBOR 编码,并将其作为主类型 3
(文本字符串)对象。
[secondsSinceEpoch, milliseconds] 的 CBOR 编码:主类型 4(数组),
包含两个主类型 0(无符号整数)项。
此算法接受值 valueToDecode,并返回
解码器对象或 undefined。
valueToDecode 是整数,则返回解码器对象。
valueToDecode 是恰好包含两个元素且
两个元素都是数字的数组,则返回解码器对象。
undefined。
此算法接受解码器对象和值 value
(整数或由两个整数组成的数组),并返回
字符串。
value 是整数:
instantMs 设置为 value * 1000。
dateString 设置为自 Unix 纪元以来
instantMs 毫秒处时间点的 ISO 8601 字符串。
dateString 中的子字符串 ".000Z"
替换为 "Z" 后的结果。
value 是双元素数组):
instantMs 设置为
value[0] * 1000 + value[1]。
instantMs。
Multibase 编解码器压缩类型为
https://w3id.org/security#multibase 的值。multibase 编码的
字符串被转换为原始字节字符串,其第一个字节是
Multibase 前缀字节,其余字节是解码后的
二进制载荷。这使得二进制载荷可以紧凑存储,
而无需承担基编码字符的额外开销。
支持以下 multibase 编码:
| Multibase 前缀字符 | Multibase 前缀字节 | 编码 |
|---|---|---|
z |
0x7a |
Base58btc |
u |
0x75 |
Base64url(无填充) |
M |
0x4d |
Base64pad |
此算法接受值 value,并返回编码器
对象或 undefined。
value 不是字符串,则返回 undefined。
value 的第一个字符是 'z'、
'u' 或 'M',则返回包含
value 的编码器对象。
undefined(不支持的 multibase
编码)。
此算法接受来自 6.5.6.1 创建 Multibase 编码器的编码器对象,并返回 CBOR 二进制数据。
prefixChar 设置为
encoderData.value 的第一个字符。
prefixByte 设置为与 prefixChar 对应的
Multibase 前缀字节。
content 设置为
encoderData.value 中从第一个字符之后开始的子字符串。
prefixChar 是 'z',则将
suffixBytes 设置为
content 的 base58btc 解码结果。
prefixChar 是 'u',则将
suffixBytes 设置为
content 的 base64url 解码结果。
prefixChar 是 'M'),将
suffixBytes 设置为
content 的 base64pad 解码结果。
bytes 设置为长度为
1 + length(suffixBytes) 的字节数组,第一个字节设置为
prefixByte,其余字节设置为
suffixBytes。
bytes 的 CBOR 编码,并将其作为主类型 2(字节
字符串)对象。
此算法接受值 valueToDecode,并返回
解码器对象或 undefined。
valueToDecode 不是字节字符串,则返回
undefined。
valueToDecode 的第一个字节是 0x7a、
0x75 或 0x4d,则返回解码器对象。
undefined(不支持的 multibase
前缀字节)。
此算法接受解码器对象和字节字符串
value,并返回字符串。
prefixByte 设置为 value 的第一个字节。
suffix 设置为 value 的其余字节
(即第一个字节之后的所有字节)。
prefixByte 是 0x7a('z'):
"z" 与
suffix 的 base58btc 编码拼接后的结果。
prefixByte 是 0x75('u'):
"u" 与 suffix 的 base64url 编码
(无填充)拼接后的结果。
prefixByte 是 0x4d('M'):
"M" 与 suffix 的 base64pad 编码
拼接后的结果。
value。
registryEntryId 作为输入,并返回字节字符串
prefix。
registryEntryBytes 设置为 registryEntryID 的 CBOR 编码
prefix 设置为把 registryEntryBytes 追加到
字节字符串 0xD9CB1D82 末尾所得的结果。
prefix。
此算法接受编码后的 CBOR-LD 载荷 cborldBytes 作为输入,并返回
要解码的主要数据 suffix,以及解压缩
suffix 时应使用的 registryEntryId 值。
cborldbytes 上的 CBOR 标签不是 0xCB1D(标签值 51997),
则抛出 ERR_NON_CBOR_LD_TAG 错误。
ERR_INVALID_PAYLOAD_STRUCTURE 错误。
registryEntryId 的值设置为被标记
数组索引 0 处整数的值。
suffix 的值设置为数组第二个元素的值。
result 设置为空映射。
result.suffix 设置为 suffix 的值,并将
result.registryEntryId 设置为
registryEntryId 的值。
result。
本节为非规范性内容。
本节为非规范性内容。
本节为非规范性内容。
本规范注册一个 CBOR 标签,使使用者能够识别 CBOR-LD 载荷。 以下内容为临时内容,尚未获得 IANA 批准。
标签:51997
注册表: https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml
数据项:数组
语义:标签值 51997 表示该载荷是 CBOR-LD。
语义说明: https://w3c.github.io/cbor-ld/#cbor-tags-for-cbor-ld
联系人:W3C JSON-LD Working Group (public-json-ld-wg@w3.org).
Referenced in:
Referenced in:
Referenced in:
Referenced in: