CBOR - Википедия - CBOR

CBOR
Расширение имени файла
.cbor
Тип интернет-СМИ
приложение / cbor
Тип форматаОбмен данными
СтандартRFC  8949
Открытый формат ?да
Интернет сайтcbor.io

Краткое представление двоичного объекта (CBOR) это двоичные данные сериализация формат, основанный на JSON. Как и JSON, он позволяет передавать объекты данных, содержащие пары имя – значение, но более кратко. Это увеличивает скорость обработки и передачи за счет удобочитаемость. Это определено в IETF RFC  8949.[1]

Среди прочего, это рекомендуемый уровень сериализации данных для CoAP Набор протоколов Интернета вещей[2][неудачная проверка ] и формат данных, в котором COSE сообщения основаны. Он также используется в Протокол клиент-аутентификатор (CTAP) в рамках проекта FIDO2.[3]

Спецификация кодировки CBOR

Данные в кодировке CBOR видны как поток элементов данных. Например.

Данные CBORЭлемент данных 1Элемент данных 2Элемент данных X ...
Количество байтов1 байт (заголовок элемента данных CBOR)ПеременнаяПеременная1 байт (заголовок элемента данных CBOR)ПеременнаяПеременнаятак далее...
СтруктураОсновной типДополнительная информацияДлина полезной нагрузки (необязательно)Полезные данные (необязательно)Основной типДополнительная информацияДлина полезной нагрузки (необязательно)Полезные данные (необязательно)так далее...
Количество бит3 бита5 бит8 бит × переменная8 бит × переменная3 бита5 бит8 бит × переменная8 бит × переменнаятак далее..

Обработка основных и дополнительных типов в каждом элементе данных

Поведение каждого элемента данных определяется основным типом и дополнительным типом. Основной тип используется для выбора основного поведения или типа каждого элемента данных.

Дополнительный тип - это дополнительная информация, точное поведение которой зависит от значения основного типа.

Кодировка поля элемента данных CBOR

Крошечное кодирование поля

Количество байтов1 байт (заголовок элемента данных CBOR)
СтруктураОсновной типДополнительная информация (значение)
Количество бит3 бита5 бит

Короткое кодирование поля

Количество байтов1 байт (заголовок элемента данных CBOR)Переменная
СтруктураОсновной типДополнительная информацияЦенить
Количество бит3 бита5 бит8 бит × (Value_Field_Byte_Count)

Кодирование длинного поля

Количество байтов1 байт (заголовок элемента данных CBOR)ПеременнаяПеременная
СтруктураОсновной типДополнительная информация (Размер поля длины)Длина полезной нагрузки (длина поля значения)Ценить
Количество бит3 бита5 бит8 бит × (Length_Field_Byte_Count)8 бит × (Value_Field_Byte_Count)

Заголовок элемента данных CBOR

В таблице ниже показано, как работает заголовок элемента данных CBOR.

Основной типЗначение основного типаЗначение дополнительного типа (беззнаковое)Дополнительное значение типаРазмер элемента в байтахТип кодировки поля
Положительное / беззнаковое целое число00b0005-битная дополнительная информация представляет собой либо само целое число (для значений дополнительной информации от 0 до 23), либо длину дополнительных данных.
От 0 до 23 (от 0x0 до 0x17) (от 0b00000 до 0b10111)Используется непосредственно как значение данных. Таким образом, сохраняя компактный размер.1Крошечный
24Следующий байт - uint8_t в секции значений данных2короткий
25Следующие 2 байта uint16_t в секции значений данных3короткий
26Следующие 4 байта - это uint32_t в разделе значений данных5короткий
27Следующие 8 байтов - это uint64_t в разделе значений данных9короткий
............
31.........
Отрицательное целое число10b001Кодирование следует правилам для целых чисел без знака (основной тип 0), за исключением того, что тогда значение равно -1 минус закодированное целое число без знака.
От 0 до 23 (от 0x0 до 0x17) (от 0b00000 до 0b10111)Используется непосредственно как значение данных. Таким образом, сохраняя компактный размер.1Крошечный
24Следующий байт - uint8_t в секции значений данных2короткий
25Следующие 2 байта uint16_t в секции значений данных3короткий
26Следующие 4 байта - это uint32_t в разделе значений данных5короткий
27Следующие 8 байтов - это uint64_t в разделе значений данных9короткий
............
31.........
Байтовая строка20b010Длина строки в байтах представлена ​​в соответствии с правилами для положительных целых чисел (основной тип 0).
От 0 до 23 (от 0x0 до 0x17) (от 0b00000 до 0b10111)Используется непосредственно как спецификатор длины данных. Таким образом, сохраняя компактный размер.до 1 + 23короткий
24Следующий байт - uint8_t для длины полезной нагрузки.до 2 + 2 ^ 8-1Длинный
25Следующие 2 байта uint16_t для длины полезной нагрузкидо 3 + 2 ^ 16-1Длинный
26Следующие 4 байта - это uint32_t для длины полезной нагрузкидо 5 + 2 ^ 32-1Длинный
27Следующие 8 байтов - это uint64_t для длины полезной нагрузкидо 9 + 2 ^ 64-1Длинный
............
31Начало неопределенной строки: объединение строк определенной длины до следующего соответствующего кода «прерывания».1Крошечный
Текстовая строка30b011Текстовая строка, а именно строка символов Юникода в кодировке UTF-8 [RFC3629].
От 0 до 23 (от 0x0 до 0x17) (от 0b00000 до 0b10111)Используется непосредственно как спецификатор длины данных. Таким образом, сохраняя компактный размер.до 1 + 23короткий
24Следующий байт - uint8_t для длины полезной нагрузки.до 2 + 2 ^ 8-1Длинный
25Следующие 2 байта uint16_t для длины полезной нагрузкидо 3 + 2 ^ 16-1Длинный
26Следующие 4 байта - это uint32_t для длины полезной нагрузкидо 5 + 2 ^ 32-1Длинный
27Следующие 8 байтов - это uint64_t для длины полезной нагрузкидо 9 + 2 ^ 64-1Длинный
............
31Начало неопределенной строки: объединение строк определенной длины до следующего соответствующего кода «разрыва».1Крошечный
Массив элементов данных40b100Массивы также называются списками, последовательностями или кортежами. Длина обозначает количество элементов данных в массиве, а не длину байта.
От 0 до 23 (от 0x0 до 0x17) (от 0b00000 до 0b10111)Используется непосредственно как спецификатор количества элементов. Таким образом, сохраняя компактный размер.1Крошечный
24Следующий байт - uint8_t для длины полезной нагрузки.2короткий
25Следующие 2 байта uint16_t для длины полезной нагрузки3короткий
26Следующие 4 байта - это uint32_t для длины полезной нагрузки5короткий
27Следующие 8 байтов - это uint64_t для длины полезной нагрузки9короткий
............
31От начала неопределенного массива до следующего соответствующего кода «Break».1Крошечный
Карта пар элементов данных50b101Карта пар элементов данных. Карты также называются таблицами, словарями, хешами или объектами (в JSON).

Длина обозначает количество пар элементов данных, а не длину байта.

Каждая запись карты принимает два элемента данных в последовательном порядке, ключевой элемент данных и элемент данных значения.

От 0 до 23 (от 0x0 до 0x17) (от 0b00000 до 0b10111)Используется непосредственно как спецификатор количества элементов. Таким образом, сохраняя компактный размер.1Крошечный
24Следующий байт - uint8_t для длины полезной нагрузки.2короткий
25Следующие 2 байта uint16_t для длины полезной нагрузки3короткий
26Следующие 4 байта - это uint32_t для длины полезной нагрузки5короткий
27Следующие 8 байтов - это uint64_t для длины полезной нагрузки9короткий
............
31Старт неопределенной карты до следующего соответствующего кода «разрыва».1Крошечный
Семантический тег60b110Используется для необязательной семантической маркировки других основных типов
Поле значения представляет идентификатор тега: см. https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml для семантического значения каждого тега.
От 0 до 23 (от 0x0 до 0x17) (от 0b00000 до 0b10111)Используется непосредственно как значение данных. Таким образом, сохраняя компактный размер.1Крошечный
24Следующий байт - uint8_t в секции значений данных2короткий
25Следующие 2 байта uint16_t в секции значений данных3короткий
26Следующие 4 байта - это uint32_t в разделе значений данных5короткий
27Следующие 8 байтов - это uint64_t в разделе значений данных9короткий
............
31...1...
Примитивы

например перемена,

плавать,

простые значения

70b111числа с плавающей запятой и простые типы данных, не нуждающиеся в содержании, а также код остановки "break"[4]
0..19(Не назначен)1Крошечный
20Ложь1Крошечный
21Истинный1Крошечный
22Ноль1Крошечный
23Неопределенный1Крошечный
24Следующий байт - uint8_t как простое значение (значение 32..255)2короткий
25Следующие 2 байта uint16_t как IEEE 754 с плавающей точкой половинной точности3короткий
26Следующие 4 байта - это uint32_t как число с плавающей запятой одинарной точности IEEE 7545короткий
27Следующие 8 байтов - это uint64_t как число с плавающей запятой двойной точности IEEE 7549короткий
28Не назначен
29
30
31"прерывание" кода остановки для элементов неопределенной длины1Крошечный
  • Байт = 8 бит

Примитивы (основной тип = 7)

Основной тип примитивов имеет значение основного типа 7. Он используется для простых типов данных, общих сложных типов с плавающей запятой, а также для управляющего кода.

Основной типДополнительная ценностьДополнительные байты (при необходимости)
Байтов012345678
Размер бит3 бита5 бит88888888
Простое значение от 0 до 23 (значение X)7Х = 0 ... 23Не используется
Простое значение от 24 до 255 (значение X)724Х = 32 ... 255Не используется
IEEE 754 с плавающей запятой половинной точности (следуют 16 бит)72516 бит IEEE 754Не используется
IEEE 754 с плавающей точкой одинарной точности (далее следует 32 бита)72632 бит IEEE 754Не используется
IEEE 754 с плавающей запятой двойной точности (далее следует 64 бита)72764 бит IEEE 754
Отрыв от неопределенного массива или карты731Не используется

Код контроля прерывания (значение дополнительного типа = 31)

Это мета-значение, которое используется вместе с массивами и картами, установленными в режим неопределенной длины. Это указывает синтаксическому анализатору CBOR закрыть соответствующий уровень карты или массива.

IEEE 754 Floats (значение дополнительного типа = 25, 26 или 27)

Это позволяет хранить числа с плавающей запятой, закодированные как значения с плавающей запятой IEEE 754.

Простое значение

Большинство простых значений либо не присвоены, либо зарезервированы для будущих улучшений.

Однако они определены.

Простое значениеСемантический
20Логическое значение false
21Логическое истина
22Ноль
23Неопределенный

Регистрация семантического тега

IANA создала реестр тегов CBOR, расположенный в https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml . Регистрация должна содержать эти шаблоны.

Тип семантического тегаКлассифицироватьШаблон
Элемент данныхСемантическое описание (краткая форма)Точка касанияОписание семантики (URL)
Стандартные действия0–23НеобходимыйНеобходимыйНет данныхНет данных
Требуется спецификация24–255НеобходимыйНеобходимыйНет данныхНет данных
Первым прибыл - первым обслужен Эквивалент в русском языке: поздний гость гложет и кость256–18446744073709551615НеобходимыйНеобходимыйНеобходимыйОписание не является обязательным.

URL-адрес может указывать на Интернет-проект или веб-страницу.

https://www.rfc-editor.org/rfc/rfc8949.html#name-cbor-tags-registry

Реализации

ИмяОсновной авторЯзыкЛицензияИсточникЗамечания
cbor-jsПатрик ГанстерерJavaScriptМассачусетский технологический институтhttps://github.com/paroga/cbor-js
узел-cborДжо ХильдебрандJavaScriptМассачусетский технологический институтhttps://github.com/hildjj/node-cbor
CBOREncodeПавел ГульбинPHPPHPhttps://github.com/2tvenom/CBOREncode
cborФэй АмакерИдтиМассачусетский технологический институтhttps://github.com/fxamacker/cborНадежно и быстро, теги CBOR, float64 / 32/16, обнаружение дублирующихся ключей карты, API кодирует / json + toarray & keyasint struct теги, Canonical CBOR, CTAP2, проверено нечеткостью.
cborПавел ГульбинИдтиWTFPLhttps://github.com/2tvenom/cbor
cbor_goБрайан ОлсонИдтиAPL 2.0https://github.com/brianolson/cbor_go
go-кодекУгоржи НвокиИдтиМассачусетский технологический институтhttps://godoc.org/github.com/ugorji/go/codecТакже обрабатывает JSON, MsgPack и BinC.
serde_cborPyfischРжавчинаMIT или APL 2.0https://github.com/pyfisch/cbor
cbor-кодекТоральф ВиттнерРжавчинаMPL 2.0https://twittner.gitlab.io/cbor-codec/cbor/
SwiftCBOR[email protected]БыстрыйБезлицензияhttps://github.com/myfreeweb/SwiftCBOR
CBOR.jlСаурав СачиданандЮляМассачусетский технологический институтhttps://github.com/saurvs/CBOR.jl
Lua-CBORКим АлвефурLuaМассачусетский технологический институтhttps://www.zash.se/lua-cbor.html
org.conman.cborШон КоннерLuaLGPL-3https://github.com/spc476/CBOR
cbor_pyБрайан ОлсонPythonAPL 2.0https://github.com/brianolson/cbor_py
FlynnФриц Конрад ГримпенPythonМассачусетский технологический институтhttps://github.com/fritz0705/flynn
cbor2Алекс ГрёнхольмPythonМассачусетский технологический институтhttps://github.com/agronholm/cbor2
CBOR :: БесплатноФелипе ГасперPerlХудожественный и GPLhttps://metacpan.org/pod/CBOR::Free
CBOR :: PPФелипе ГасперPerlХудожественный и GPLhttps://metacpan.org/pod/CBOR::PP
CBOR :: XSМарк ЛеманнPerlGPL-3https://metacpan.org/pod/CBOR::XS
cbor-rubyСадаюки Фурухаси

Карстен Борман

РубинAPL 2.0https://github.com/cabo/cbor-ruby
libcbor-rubyПавел КалводаРубинМассачусетский технологический институтhttps://github.com/PJK/libcbor-rubyПривязка к libcbor.
cbor-erlangДжихён ЮErlangBSD-3-пунктhttps://github.com/yjh0502/cbor-erlang
ExcborКарстен БорманЭликсирне указано,

спроси автора

https://github.com/cabo/excbor
CBORР. Кайл МерфиHaskellLGPL-3https://github.com/orclev/CBOR
BorcДжо Хильдебранд

Фридель Зигельмайер

JavaScriptМассачусетский технологический институтhttps://github.com/dignifiedquire/borcВилка узла-бор.
Borc-refsДжо Хильдебранд

Фридель Зигельмайер

Сандро Хоук

JavaScriptМассачусетский технологический институтhttps://github.com/sandhawke/borc-refsВилка борц.
CBORПитер ОкцилC #Программное обеспечение общественного достоянияhttps://github.com/peteroupc/CBORТакже обрабатывает JSON.
Dahomey.CborМикаэль КатанзаритиC #Лицензия MIThttps://github.com/dahomey-technologies/Dahomey.Cbor
ДжексонТату СалорантаЯваАПЛ-2.0https://github.com/FasterXML/jackson-dataformats-binary/tree/master/cborТакже обрабатывает другие форматы.
cbor-javaКонстантин РэкЯваАПЛ-2.0https://github.com/c-rack/cbor-java
ДжейкобJ.W. ЯнссенЯваАПЛ-2.0https://github.com/jawi/jacob
kotlinx.serializationJetBrainsКотлинАПЛ-2.0https://github.com/Kotlin/kotlinx.serializationПоддерживает кроссплатформенность
cn-cborДжо Хильдебранд

Карстен Борман

CМассачусетский технологический институтhttps://github.com/cabo/cn-cbor
cbor-cppСтанислав ОвсянниковC ++АПЛ-2.0https://github.com/naphaso/cbor-cpp
cppborДэвид ПрисC ++BSDhttps://github.com/rantydave/cppborИспользует варианты C ++ 17.
libcborПавел КалводаCМассачусетский технологический институтhttps://github.com/PJK/libcbor
tinycborIntelCМассачусетский технологический институтhttps://github.com/01org/tinycbor
NanoCBORКоэн ЗандбергCLGPLhttps://github.com/bergzand/NanoCBORИспользован RIOT-OS
cbor-dАндрей ПенечкоDПовышение 1.0https://github.com/MrSmith33/cbor-d
clj-cborГрег ЛукClojureБезлицензияhttps://github.com/greglook/clj-cbor
JSON для современного C ++Нильс ЛоманнC ++Массачусетский технологический институтhttps://github.com/nlohmann/jsonТакже обрабатывает JSON и MsgPack.
Бора бораКристоф ЭнгельбертЯваАПЛ-2.0https://github.com/noctarius/borabora
lua-ConciseSerializationФрансуа ПеррадLuaМассачусетский технологический институтhttps://web.archive.org/web/20170322112326/https://fperrad.github.io/lua-ConciseSerialization/
фланнФриц Конрад Гримпен

Соколов Юра

PythonМассачусетский технологический институтhttps://pypi.python.org/pypi/flunn
cbor-qtАнтон ДутовC ++Всеобщее достояниеhttps://github.com/anton-dutov/cbor-qt
QCborValueQt ProjectC ++LGPLhttps://doc.qt.io/qt-5/qcborvalue.htmlЧасть Qt framework начиная с версии 5.12
cbor11Якоб Вармоз БенценC ++Всеобщее достояниеhttps://github.com/jakobvarmose/cbor11
cborcppАлексей НекипеловC ++Массачусетский технологический институтhttps://github.com/nekipelov/cborcpp
Золотая рыбкаВинсент ЛаскоC ++Массачусетский технологический институтhttps://github.com/OneNoteDev/GoldFish
Библиотека-Arduino-CborХуанджо ТараC ++АПЛ-2.0https://github.com/jjtara/Library-Arduino-Cbor
cborgДункан КуттсHaskellBSD-3-пунктhttps://github.com/well-typed/cborg
cborСтив ХэмблеттДротикМассачусетский технологический институтhttps://github.com/shamblett/cbor
бурильщикМатиас ДеницScalaMPL 2.0https://github.com/sirthias/borerТакже обрабатывает JSON.
nim_cborЭмери ХемингуэйНимМассачусетский технологический институтhttps://git.sr.ht/~ehmry/nim_cbor
киборийНатаниэль МакКаллум

Марк Беставрос

Команда Enarx

РжавчинаApache 2.0https://github.com/enarx/ciborium

Смотрите также

Рекомендации

внешняя ссылка