Copyright © 2020-2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
CBOR는 간결한 이진 데이터 직렬화 및 메시징 형식이다. 이 명세는 연결 데이터를 직렬화하기 위한 CBOR 기반 형식인 CBOR-LD 1.0을 정의한다. 이 인코딩은 현재 수억 개의 시스템에 배포되어 있는 기존 JSON-LD 생태계를 활용하여, 연결 데이터를 위한 효율적인 인코딩 방식을 원하는 경우에 간결한 직렬화 형식을 제공하도록 설계되었다. 의미론적 압축 방식을 활용하면 일반적인 압축 방식보다 60% 이상 향상된 압축률을 달성할 수 있다. 이 형식은 주로 저장 공간과 대역폭이 제한된 프로그래밍 환경에서 연결 데이터를 사용하고, 상호 운용 가능한 의미론적 와이어 수준 프로토콜을 구축하며, CBOR 기반 스토리지 엔진에 연결 데이터를 효율적으로 저장하기 위한 방법으로 사용하도록 의도되었다.
이 절에서는 발행 당시 이 문서의 상태를 설명한다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인에서 확인할 수 있다.
이 문서는 실험적이다.
이 문서에 설명된 기능을 시연할 수 있는 참조 구현이 있다.
이 문서는 JSON-LD 작업 그룹이 권고 트랙을 사용하여 작업 초안으로 발행했다.
작업 초안으로 발행되었다고 해서 W3C와 그 회원이 이를 승인했다는 의미는 아니다.
이 문서는 초안이며 언제든지 다른 문서에 의해 업데이트, 대체되거나 폐기될 수 있다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 적절하지 않다.
이 문서는 W3C 특허 정책에 따라 운영되는 그룹이 작성했다. W3C는 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지하며, 해당 페이지에는 특허를 공개하기 위한 지침도 포함되어 있다. 자신이 알고 있는 특허에 필수 청구항이 포함되어 있다고 믿는 사람은 W3C 특허 정책 제6절에 따라 해당 정보를 공개해야 한다.
이 문서는 2025년 8월 18일 W3C 프로세스 문서의 적용을 받는다.
이 절은 비규범적이다.
CBOR는 간결한 이진 데이터 직렬화 및 메시징 형식이다. 이 명세는 연결 데이터를 직렬화하기 위한 CBOR 기반 형식인 CBOR-LD 1.0을 정의한다. 이 인코딩은 현재 수억 개의 시스템에 배포되어 있는 기존 JSON-LD 생태계를 활용하여, 연결 데이터를 위한 효율적인 인코딩 방식을 원하는 경우에 간결한 직렬화 형식을 제공하도록 설계되었다. 의미론적 압축 방식을 활용하면 일반적인 압축 방식보다 60% 이상 향상된 압축률을 달성할 수 있다. 이 형식은 주로 저장 공간과 대역폭이 제한된 프로그래밍 환경에서 연결 데이터를 사용하고, 상호 운용 가능한 의미론적 와이어 수준 프로토콜을 구축하며, CBOR 기반 스토리지 엔진에 연결 데이터를 효율적으로 저장하기 위한 방법으로 사용하도록 의도되었다.
이 절은 비규범적이다.
이 문서는 CBOR에서 연결 데이터를 직렬화하기 위한 상세 명세이다. 이 문서는 주로 다음 독자를 대상으로 한다:
비규범적으로 표시된 절뿐만 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예제 및 참고 사항은 비규범적이다. 이 명세의 그 밖의 모든 내용은 규범적이다.
이 문서에서 핵심 단어 할 수 있다(MAY), 해야 한다(MUST), 그리고 선택 사항(OPTIONAL)은 여기에 표시된 것처럼 모두 대문자로 나타나는 경우에만 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 태그에 식별자가 포함된 CBOR-LD 레지스트리 엔트리에 의해 선택된다( 5. CBOR-LD용 CBOR 태그 참조).
처리 모델은 구현이 JSON-LD 문서를 CBOR-LD로, 그리고 CBOR-LD에서 JSON-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이며, 이는
노드 참조 및 용어가 @id의 @type으로 정의된 값과 일치한다.
변환 중에는
값의 유형에 바인딩된 코덱이 있는 경우 해당 코덱을 사용하여
그 값을 압축하고 압축 해제한다. codecs가 없고 기본 처리 모델을 사용하지 않는 경우
일반적인 유형화된 값 코덱은 적용되지 않는다.
이 명세는 아래 표의 코덱 식별자를 정의한다. 다른 명세에서 정의한 처리 모델은 해당 명세가 대응하는 코덱을 정의한다는 조건으로 추가 코덱 식별자를 사용할 수 있다(MAY).
| 코덱 식별자 | 코덱 | 기본 처리 모델에서 바인딩되는 유형 |
|---|---|---|
url |
URL 코덱 | url |
xsd-date |
XSD 날짜 코덱 | http://www.w3.org/2001/XMLSchema#date |
xsd-date-time |
XSD 날짜/시간 코덱 | 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 멤버를 완전히 생략하고도
동일한 동작을 얻을 수 있다(MAY).
사용자가 의미론적 압축을 사용하지 않으려 하거나 기본 처리 모델에 포함된 것과
다른 코덱을 사용하여 압축하려는 경우, 레지스트리 엔트리는
사용자 정의 처리 모델을 지정할 수 있다. 다음은 의미론적 압축을 사용하지 않고
xsd-date-time 코덱만 사용하는 처리 모델의 예이다:
processingModel:
semanticCompression: false
codecs:
"http://www.w3.org/2001/XMLSchema#dateTime": xsd-date-time
4.2.1 코덱 식별자에는 이 명세에서 정의한 코덱이 나열되어 있다. CBOR-LD 코덱은 확장 지점으로도 의도되었다. 처리 모델은 여기에 지정되지 않았지만 대신 해당 처리 모델을 정의하는 명세 또는 다른 문서에서 정의된 코덱을 사용할 수 있다(MAY).
이 명세는 사용자 지정 코덱의 동작 방식이나 지정 방식을 제한하지 않는다. 그러한 코덱을 사용하는 처리 모델을 정의하는 문서는 상호 운용 가능한 구현에 충분할 정도로 각 코덱을 정확하게 지정할 책임이 있으며, 테스트와 정확성에 대한 책임도 진다. 이 명세에서 정의된 코덱은 IRI로 식별되어야 한다(MUST).
다음 예는 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)는 CBOR-LD에 사용하기 위해
IANA
CBOR 태그 레지스트리에 등록되어 있다. 이 태그 값 바로 뒤에 오는
데이터는 압축된 페이로드를 생성하는 데 사용된 레지스트리 엔트리를 식별한다.
CBOR-LD 페이로드는 태그 0xCB1D가 지정된 항목이
2개 요소로 이루어진 배열이 되도록 구성되어야 하며(MUST),
첫 번째 요소는 주 유형 0 정수여야
한다(MUST).
이 정수는 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를 입력으로 받아 16진수 문자열
cborldBytes를 반환한다.
registryEntryId를
6.6.1 CBOR
태그 구조 가져오기 알고리즘에 전달한 결과로 prefix를 설정한다.
state를 빈 맵으로 설정한다.
registryEntryId와 연결된 레지스트리 엔트리가 의미론적
압축을 요구하는 경우:
state.strategy를 "compression"으로 설정한다.
state.typeTable을 typeTable로 설정한다.
state.registryEntryId를 registryEntryId로 설정한다.
state를
6.2.1
변환 초기화 알고리즘에 state를 전달한 결과로 설정한다.
state와 jsonldDocument를
inputDocuments로 6.2.2 문서 변환 알고리즘에 전달한
결과로 output을 설정한다.
suffix를 output의 CBOR 인코딩으로 설정한다.
suffix를 jsonldDocument의 CBOR 인코딩으로 설정한다.
cborldBytes를 suffix 앞에 추가한 prefix의 16진수 인코딩으로
설정한다.
cborldBytes를 반환한다.
이 알고리즘은 CBOR-LD 페이로드 cborldBytes를 입력으로 받아 JSON-LD 문서
jsonldDocument를 반환한다.
state를 빈 맵으로 설정한다.
cborldBytes를
6.6.2 레지스트리
엔트리 ID 가져오기 알고리즘에 전달한 결과로 result를 설정한다.
state.registryEntryId를
result.registryEntryId로 설정하고 suffix를
result.suffix로 설정한다.
state.registryEntryId와 연결된 레지스트리 엔트리가
의미론적 압축을 사용하는 경우:
state.strategy를 "decompression"으로 설정한다.
registryEntryId와 연결된 CBOR-LD Varint 레지스트리 엔트리의
typeTables 배열에 있는 각 엔트리
type: map에 대해 해당 엔트리를
state.typeTable에 추가하고,
state.reverseTypeTable에서
type의 값을 inverseMap으로 설정한다. 여기서
inverseMap은 매핑을 반전한 map이다.
state를
6.2.1
변환 초기화 알고리즘에 state를 전달한 결과로 설정한다.
input을 suffix를 바이트에서 맵으로 디코딩한 결과로
설정한다.
jsonldDocument를 state와
input을 inputDocuments로
6.2.2
문서 변환 알고리즘에 전달한 결과로 설정한다.
jsonldDocument를 suffix를
바이트에서 맵으로 디코딩한 결과로 설정한다.
jsonldDocument를 반환한다.
이 절의 알고리즘은 데이터 형식 간에 입력을 추상적으로 변환하기 위한 "변환기"의 동작을 설명한다. 이 절의 뒷부분에서 정의되는 "compression" 및 "decompression" 전략과 같은 "전략"과 함께 사용하면, 이러한 알고리즘을 구체적인 데이터 형식 간 변환에 적용할 수 있다. "compression" 전략은 JSON-LD에서 CBOR-LD로 변환하고, "decompression" 전략은 CBOR-LD에서 JSON-LD로 변환한다.
이 알고리즘은 맵 state를 입력으로 받아 반환한다.
state를
6.4.1
컨텍스트 로더 초기화 알고리즘에 state를 전달한 결과로 설정한다.
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로 설정한다.
state,
activeContext, input, 그리고 output을 전달하여 얻은
result의 result.activeContext로 activeContext를,
result.output으로 output을, 그리고
result.state로 state를 설정한다.
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, unconvertedValue를
value로, 그리고 valueActiveContext를
activeContext로 전달한 결과로 설정한다.
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이 정의되어 있으면 state와
output을 포함하는 맵인 result를 반환한다.
value가 배열인 경우:
outputs를 빈 배열로 설정한다.
value의 각 element에 대해:
result를 6.2.4 값 변환 알고리즘에
activeContext, state,
termInfo, termType, 그리고 element를
value로 전달한 결과로 설정한다. state를
result.state로 설정하고
result.output을
outputs에 추가한다.
result를 빈 맵으로 설정한다. result.state를
state로 설정하고 result.output을
outputs로 설정한다.
result를 반환한다.
output을 빈 맵으로 설정한다.
result를 6.2.3 일반 변환 알고리즘에
state,
activeContext, value를 input으로, 그리고 output을
전달한 결과로 설정한다.
result를 반환한다.
이 절의 알고리즘은 JSON-LD를 CBOR-LD로 변환하기 위해 앞에서 정의한 "conversion" 알고리즘과 함께 사용할 "compression" 전략을 정의한다.
이 알고리즘은 맵 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에 대해:
input에 term의 엔트리가 있는 경우:
types를 input에서 term의 값으로
설정한다.
types의 각 값을 objectTypes에 추가한다.
objectTypes를 반환한다.
이 절의 알고리즘은 CBOR-LD를 JSON-LD로 변환하기 위해 앞에서 정의한 "conversion" 알고리즘과 함께 사용할 "decompression" 전략을 정의한다.
이 알고리즘은 맵 state, activeContext, input,
그리고 output을 입력으로 받고,
맵 output, state, 그리고
activeContext를 포함하는 맵 result를 반환한다.
decoderData를 6.5.1.3 컨텍스트 디코더 생성에
state.reverseTypeTable을 전달한 결과로 설정한다.
contextTermId를
state.keywordsMap에서 "@context"의 값으로 설정한다.
input에 contextTermId의 엔트리가 있으면
output에서 "@context"의 값을 6.5.1.4 컨텍스트 디코딩에
decoderData와
input에서 contextTermId의 값을 value로 전달한 결과로 설정한다.
contextTermIdPlural을 contextTermId의 값에 1을 더한 값으로 설정한다.
input에 contextTermIdPlural의 엔트리가 있는 경우:
input에 contextTermId의 엔트리도
있었다면
ERR_INVALID_ENCODED_CONTEXT 오류를 발생시킨다.
encodedContexts를 input에서
contextTermIdPlural의 값으로 설정한다.
encodedContexts가 배열이 아니면
ERR_INVALID_ENCODED_CONTEXT 오류를 발생시킨다.
contexts를 빈 배열로 설정한다.
encodedContexts의 각 valueToDecode에 대해,
decoderData와 valueToDecode를
value로 6.5.1.4 컨텍스트 디코딩에 전달한 결과를
contexts에 추가한다.
output에서 "@context"의 값을 contexts로 설정한다.
embeddedContextResult를 6.3.2
내장 컨텍스트 적용 알고리즘에
activeContext, output을 input으로, 그리고
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의 값으로 설정한다.
termId와 termId에 1을 더한 값 모두
input에 없으면 계속한다.
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, 그리고 "@vocab"을
termType으로 전달한 결과로 설정한다.
decoderData가 존재하면 6.5.2.4
값 디코딩에 decoderData를 전달한 결과를
`objectTypes에 추가한다.
value를 objectTypes에 추가한다.
objectTypes를 반환한다.
이 절의 알고리즘은 JSON-LD 문서와 연결된 컨텍스트 문서의 어떤 구성 요소가 압축 또는 압축 해제 과정의 특정 시점에 사용되고 있는지를 결정하는 방법을 설명한다. 이러한 알고리즘에는 CBOR-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,
activeContext.termMap을
activeTermMap으로, 그리고 input에서 '@context'의 값을
contexts로
6.3.5 용어
맵 업데이트 알고리즘에 전달한 결과로 설정한다.
state를 termMapUpdateResult.state로 설정한다.
termMap을 termMapUpdateResult.activeTermMap으로 설정한다.
newActiveContext를 6.3.1
활성 컨텍스트 초기화 알고리즘에
termMap과 activeContext를
previousActiveContext로 전달한 결과로 설정한다.
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,
revertedTermMap을
activeTermMap으로, true를 propertyScope로, 그리고
contexts를
6.3.5 용어
맵 업데이트 알고리즘에 전달한 결과로 설정한다.
state를 termMapUpdateResult.state로 설정한다.
termMap을 termMapUpdateResult.activeTermMap으로 설정한다.
newActiveContext를 6.3.1
활성 컨텍스트 초기화 알고리즘에
termMap과 activeContext를
previousActiveContext로 전달한 결과로 설정한다.
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,
newTermMap을
activeTermMap으로, contexts를, 그리고 true를
typeScope로
6.3.5
용어 맵 업데이트 알고리즘에 전달한 결과로 설정한다.
state를 termMapUpdateResult.state로, 그리고
newTermMap을
termMapUpdateResult.activeTermMap으로 설정한다.
newActiveContext를 6.3.1
활성 컨텍스트 초기화 알고리즘에
newTermMap을 termMap으로, 그리고 activeContext를
previousActiveContext로 전달한 결과로 설정한다.
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로 설정한다.
context에 @propagate가 있으면 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의 값들과
def.propagate의 값으로 설정된
propagate를 포함하는 맵으로 설정한다.
context에 term이 있으면,
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가 정의되지 않은 상태가 아니고 def.propagate가
false로 설정되어 있는 동안:
currentContext를
activeContext.previousActiveContext로 설정한다.
def를
currentContext.termMap에서 term의 값으로 설정한다.
def가 정의되지 않은 상태가 아니면 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를 입력으로 받고,
맵 state와 entry를 포함하는 맵
result를 반환한다.
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을 입력으로 받고,
맵 state와 entry를 포함하는 맵 result를 반환한다.
context에 "@import" 엔트리가 있는 경우:
importUrl을 `context에서 "@import"의 값으로 설정한다.
state.contextMap에 importUrl의 엔트리가 없는 경우:
importUrl과 연결된 컨텍스트 객체를 가져오고
importContext를 해당 객체의
"@context" 값으로 설정한다.
importedContextAdditionResult를 6.4.3
컨텍스트 추가 알고리즘에
state, importContext를 context로,
그리고 importUrl을 contextUrl로 전달한 결과로 설정한다.
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의 값을
주 유형 0(부호 없는 정수) 객체로 CBOR 인코딩하여 반환한다.
encoderData.context의 값을 주 유형 3
(텍스트 문자열) 객체로 CBOR 인코딩하여 반환한다.
이 알고리즘은 맵 reverseTypeTable을 입력으로 받고
맵 encoderData를 반환한다.
reverseContextTable을
reverseTypeTable에서 "context"의 값으로 설정한다.
decoderData를 빈 맵으로 초기화한다.
decoderData.reverseContextTable을
reverseContextTable의 값으로 설정하고
decoderData를 반환한다.
이 알고리즘은 맵 decoderData와 값 value를 입력으로 받고
값을 반환한다.
value가 숫자가 아니면 value를 반환한다.
decoderData.reverseContextTable에
value의 엔트리가 있으면 해당 엔트리의
값을 반환한다.
이 알고리즘은 맵 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를 주 유형 2(바이트 문자열) 객체로 CBOR 인코딩하여 반환한다.
intValue를 주 유형 0(부호 없는
정수) 객체로 CBOR 인코딩하여 반환한다.
이 알고리즘은 맵 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 코덱을 사용하는 구현은 아래 테이블을 사용해야 한다(MUST). 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로 시작하고
prefix 뒤에 오는 valueToEncode의 나머지 부분에
":"(U+003A COLON) 문자가 포함되지 않는 엔트리로 설정한다. 그러한
엔트리가 없으면 undefined를 반환한다(즉, 이 URL에는
압축을 적용할 수 없다).
prefix가 "https://" 또는
"http://"이면,
valueToEncode를
6.5.3.6.1 HTTP
URL 인코더 생성에 전달한 결과를 반환한다.
prefix가 "urn:uuid:"이면,
valueToEncode를
6.5.3.7.1 UUID
URN 인코더 생성에 전달한 결과를 반환한다.
prefix가 "data:"이면,
valueToEncode를
6.5.3.8.1 Data
URL 인코더 생성에 전달한 결과를 반환한다.
prefix가 "did:v1:nym:" 또는
"did:key:"이면,
valueToEncode를
6.5.3.9.1
Base58 DID URL 인코더 생성에 전달한 결과를 반환한다.
undefined를 반환한다(즉, 이 URL에는 압축을 적용할 수 없다).
이 알고리즘은 6.5.3.2 URL 인코더 생성에서 생성된 인코더 객체를 입력으로 받고 CBOR 이진 데이터를 반환한다.
termId를
주 유형 0(부호 없는 정수) 객체로 CBOR 인코딩하여 반환한다.
encode 메서드를
호출하고 그 결과인 CBOR 이진 데이터를 반환한다.
이 알고리즘은 맵 state, 맵 termInfo,
그리고 값 valueToDecode를 입력으로 받고 디코더 객체 또는
undefined를 반환한다.
valueToDecode가 문자열이면 undefined를 반환한다
(즉, 값은 이미 압축되지 않은 URL 문자열이므로 그대로 전달한다).
valueToDecode가 배열인 경우:
prefixId를
valueToDecode의 첫 번째 요소로 설정한다.
prefix를 URL 접두사
역방향 테이블에서 prefixId에 해당하는 값으로 설정한다.
prefix가 "http://" 또는
"https://"이면, decoder를
valueToDecode를
6.5.3.6.3
HTTP URL 디코더 생성에 전달한 결과로 설정한다.
prefix가 "urn:uuid:"이면,
decoder를
valueToDecode를
6.5.3.7.3
UUID URN 디코더 생성에 전달한 결과로 설정한다.
prefix가 "data:"이면,
decoder를
valueToDecode를
6.5.3.8.3
Data URL 디코더 생성에 전달한 결과로 설정한다.
prefix가 "did:v1:nym:" 또는
"did:key:"이면, decoder를
valueToDecode를
6.5.3.9.4 Base58 DID URL 디코더 생성에 전달한 결과로 설정한다.
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은
2개 요소로 이루어진 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가 정확히 2개의 요소를 가지며 두 번째
요소가 텍스트 문자열인 경우:
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은 2개 요소로 이루어진 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가 정확히 2개의 요소를 가지며 두 번째
요소가 바이트 문자열 또는 텍스트 문자열이면 디코더 객체를 반환한다.
undefined를 반환한다.
이 알고리즘은 디코더 객체와 CBOR 배열
valueToDecode를 입력으로 받고 문자열을 반환한다.
valueToDecode[1]이 텍스트 문자열이면 uuid를
valueToDecode[1]로 설정한다.
uuid를 [RFC4122]에 따른
16바이트 이진 값 valueToDecode[1]의 UUID 문자열 표현
(소문자, 하이픈 구분 형식)으로 설정한다.
"urn:uuid:"와
uuid를 연결한 값을 반환한다.
Data URL 코덱은 접두사가
data:인 값([RFC2397]에 정의된 data URL)을 처리한다.
Base64로 인코딩된 data URL
(data:<mediatype>;base64,<data>와 일치)은
3개 요소로 이루어진 CBOR 배열
[4, mediatype, dataBytes]로 인코딩된다. Base64가 아닌 data URL은
2개 요소로 이루어진 CBOR 배열 [4, rest]로 인코딩되며, 여기서
rest는 "data:" 뒤에 오는 URL 부분이다.
이 알고리즘은 문자열 value를 입력으로 받고 인코더
객체 또는 undefined를 반환한다.
value가 "data:"로 시작하지 않으면
undefined를 반환한다.
value를 정규 표현식
^data:(?<mediatype>.*);base64,(?<data>.*)$과
일치시키려고 시도하며,
각 .*는 탐욕적이다(즉, 문자열
";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가 정확히 3개의 요소를 가지며, 두 번째
요소가 텍스트 문자열이고 세 번째 요소가 바이트 문자열이면
디코더 객체(base64 모드)를 반환한다.
valueToDecode가 정확히 2개의 요소를 가지며
두 번째 요소가 텍스트 문자열이면 디코더 객체
(비-base64 모드)를 반환한다.
undefined를 반환한다.
이 알고리즘은 디코더 객체와 CBOR 배열
valueToDecode를 입력으로 받고 문자열을 반환한다.
valueToDecode가 3개의 요소를 갖는 경우(base64 모드):
mediatype을 valueToDecode[1]로 설정한다.
encodedData를 바이트 문자열
valueToDecode[2]의 base64 인코딩으로 설정한다.
"data:",
mediatype, ";base64,", 그리고
encodedData를 연결한 값을 반환한다.
"data:"와
valueToDecode[1]을 연결한 값을 반환한다.
Base58 DID URL 코덱은 접두사가
did:v1:nym: 또는 did:key:이고,
권한(및 선택적 프래그먼트) 구성 요소가 일반적으로 multibase
base58btc 인코딩 문자열(문자
'z'로 시작하는 문자열)인 DID URL을 처리한다. 압축된 DID URL은 2개 또는
3개 요소로 이루어진 CBOR 배열 [prefixId, authority] 또는
[prefixId, authority, fragment]로 인코딩된다. 구성 요소가
'z'로 시작하고 유효한 base58btc이면 원시 바이트
문자열로 저장되고, 그렇지 않으면 텍스트 문자열로 저장된다.
이 알고리즘은 문자열 value를 입력으로 받고
인코더 객체 또는 undefined를 반환한다.
"did:"로 시작하는
URL 접두사 테이블의 각
[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를
authority에
Multibase Base58에서 CBOR 토큰으로
알고리즘을 적용한 결과로 설정한다.
entries를
[encoderData.prefixId, authorityEncoded]로 초기화한다.
fragment가 정의되어 있는 경우:
fragmentEncoded를
fragment에
Multibase Base58에서 CBOR
토큰으로 알고리즘을 적용한 결과로 설정한다.
fragmentEncoded를 entries에 추가한다.
entries를 주 유형 4
(배열)로 CBOR 인코딩하여 반환한다.
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가 정확히 2개 또는 3개의 요소를 갖는 경우:
prefix를 URL 접두사
역방향 테이블에서 valueToDecode[0]의 값으로 설정한다.
prefix를 포함하는 디코더 객체를 반환한다.
undefined를 반환한다.
이 알고리즘은
6.5.3.9.4
Base58 DID URL 디코더 생성의 디코더 객체와 CBOR 배열
valueToDecode를 입력으로 받고 문자열을 반환한다.
url을 decoderData.prefix로 설정한다.
valueToDecode[1]이 바이트 문자열이면,
'z' 뒤에
valueToDecode[1]의 base58btc 인코딩을 이어 붙여
url에 추가한다.
valueToDecode[1]을 url에 추가한다.
valueToDecode가 2개보다 많은 요소를 갖는 경우:
valueToDecode[2]가 바이트 문자열이면
"#z" 뒤에
valueToDecode[2]의 base58btc 인코딩을 이어 붙여
url에 추가한다.
"#" 뒤에
valueToDecode[2]을 이어 붙여 url에 추가한다.
url을 반환한다.
XSD 날짜 코덱은 유형이
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를
Unix 에포크 이후의 밀리초 수로 표현되는 ISO 8601 날짜 문자열로
파싱한 결과로 설정한다.
parsed가 유효한 숫자가 아니면
undefined를 반환한다.
value와
parsed를 포함하는 인코더 객체를 반환한다.
이 알고리즘은 6.5.4.1 XSD 날짜 인코더 생성의 인코더 객체를 입력으로 받고 CBOR 이진 데이터를 반환한다.
secondsSinceEpoch를
floor(encoderData.parsed / 1000)으로 설정한다.
reconstituted를 Unix
에포크 이후 secondsSinceEpoch × 1000밀리초인 시점의 ISO 8601 문자열로
설정한다.
expectedDate를
reconstituted에서 'T'가 처음 나타나기 전의
부분 문자열로 설정한다.
encoderData.value가
expectedDate와 같지 않으면 압축으로 인해 정보가 손실된다.
encoderData.value를 주 유형 3(텍스트
문자열) 객체로 CBOR 인코딩하여 반환한다.
secondsSinceEpoch가
0보다 크거나 같으면
secondsSinceEpoch를 주 유형 0(부호 없는 정수)
객체로 CBOR 인코딩하여 반환한다.
secondsSinceEpoch를
주 유형 1(음의 정수) 객체로 CBOR 인코딩하여 반환한다.
이 알고리즘은 값 valueToDecode를 입력으로 받고
디코더 객체 또는 undefined를 반환한다.
valueToDecode가 정수(양수, 음수 또는
0)이면 디코더 객체를 반환한다.
undefined를 반환한다.
이 알고리즘은 디코더 객체와 정수 값
value를 입력으로 받고 문자열을 반환한다.
dateString을 Unix 에포크 이후
value * 1000밀리초인 시점의 ISO 8601 문자열로 설정한다.
dateString에서 'T'가 처음
나타나기 전의 부분 문자열을 반환한다.
XSD DateTime 코덱은 유형이
http://www.w3.org/2001/XMLSchema#dateTime인 값을 압축한다. 초 단위 정밀도의
날짜 및 시간 값은 Unix 에포크 이후의 초 수를 나타내는 하나의 정수
(주 유형 0 또는 1)로 인코딩된다. 초 미만 정밀도의 날짜 및 시간 값은
2개 요소로 이루어진 CBOR 배열 [seconds,
milliseconds]로 인코딩되며, 둘 다 주 유형 0 정수이다. XSD
날짜 코덱과 마찬가지로 압축이 무손실인 경우에만 값이 압축된다
(원래 문자열이 인코딩을 통해 정확히 왕복 변환됨).
이 알고리즘은 문자열 value를 입력으로 받고 인코더
객체 또는 undefined를 반환한다.
value에 문자 'T'가 포함되어 있지 않으면
undefined를 반환한다(이 값은 대신
XSD 날짜 코덱으로 압축된다).
parsed를 value를
Unix 에포크 이후의 밀리초 수로 표현되는 ISO 8601 날짜 및 시간 문자열로
파싱한 결과로 설정한다.
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를 주 유형 3
(텍스트 문자열) 객체로 CBOR 인코딩하여 반환한다.
secondsSinceEpoch가
0보다 크거나 같으면
secondsSinceEpoch를 주 유형 0(부호 없는 정수)
객체로 CBOR 인코딩하여 반환한다.
secondsSinceEpoch를
주 유형 1(음의 정수) 객체로 CBOR 인코딩하여 반환한다.
millisecondIndex를
encoderData.value에서 첫 번째 '.'의 인덱스로 설정한다.
milliseconds를
encoderData.value의 위치
millisecondIndex + 1부터 시작하는 숫자들의 정수 값으로 설정한다.
expectedDate를 Unix 에포크 이후
secondsSinceEpoch * 1000 + milliseconds밀리초인 시점의
ISO 8601 문자열로 설정한다.
encoderData.value가
expectedDate와 같지 않으면 압축으로 인해 정보가 손실된다.
encoderData.value를 주 유형 3
(텍스트 문자열) 객체로 CBOR 인코딩하여 반환한다.
[secondsSinceEpoch, milliseconds]을 CBOR 인코딩하여 반환한다. 주 유형 4(배열)에
2개의 주 유형 0(부호 없는 정수) 항목이 포함된다.
이 알고리즘은 값 valueToDecode를 입력으로 받고
디코더 객체 또는 undefined를 반환한다.
valueToDecode가 정수이면 디코더 객체를 반환한다.
valueToDecode가 정확히 2개의 요소를 가진 배열이고
두 요소가 모두 숫자이면 디코더 객체를 반환한다.
undefined를 반환한다.
이 알고리즘은 디코더 객체와 값 value
(정수 또는 2개 요소로 이루어진 정수 배열)를 입력으로 받고
문자열을 반환한다.
value가 정수인 경우:
instantMs를 value * 1000으로 설정한다.
dateString을 Unix 에포크 이후
instantMs밀리초인 시점의 ISO 8601 문자열로 설정한다.
dateString에서 부분 문자열 ".000Z"를
"Z"로 대체한 값을 반환한다.
value가 2개 요소로 이루어진 배열인 경우):
instantMs를
value[0] * 1000 + value[1]로 설정한다.
instantMs를 반환한다.
Multibase 코덱은 유형이
https://w3id.org/security#multibase인 값을 압축한다. multibase로 인코딩된
문자열은 첫 번째 바이트가
Multibase 접두사 바이트이고 나머지 바이트가 디코딩된
이진 페이로드인 원시 바이트 문자열로 변환된다. 이를 통해
Base 인코딩 문자에 따른 오버헤드 없이 이진 페이로드를
간결하게 저장할 수 있다.
다음 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를 주 유형 2(바이트
문자열) 객체로 CBOR 인코딩하여 반환한다.
이 알고리즘은 값 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를 바이트 문자열 0xD9CB1D82의 끝에
registryEntryBytes를 추가한 결과로 설정한다.
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-LD 페이로드를 식별할 수 있도록 CBOR 태그를 등록한다. 다음 내용은 잠정적이며 아직 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
연락처: Wesley Smith (wsmith@digitalbazaar.com)
Referenced in:
Referenced in:
Referenced in:
Referenced in: