CBOR - CBOR
Эта статья слишком полагается на Рекомендации к основные источники.Апрель 2020) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Расширение имени файла | .cbor |
---|---|
Тип интернет-СМИ | приложение / cbor |
Тип формата | Обмен данными |
Стандарт | RFC 8949 |
Открытый формат ? | да |
Интернет сайт | cbor |
Краткое представление двоичного объекта (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.
Основной тип | Значение основного типа | Значение дополнительного типа (беззнаковое) | Дополнительное значение типа | Размер элемента в байтах | Тип кодировки поля | |
---|---|---|---|---|---|---|
Положительное / беззнаковое целое число | 0 | 0b000 | 5-битная дополнительная информация представляет собой либо само целое число (для значений дополнительной информации от 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 | ... | ... | ... | |||
Отрицательное целое число | 1 | 0b001 | Кодирование следует правилам для целых чисел без знака (основной тип 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 | ... | ... | ... | |||
Байтовая строка | 2 | 0b010 | Длина строки в байтах представлена в соответствии с правилами для положительных целых чисел (основной тип 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 | Крошечный | |||
Текстовая строка | 3 | 0b011 | Текстовая строка, а именно строка символов Юникода в кодировке 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 | Крошечный | |||
Массив элементов данных | 4 | 0b100 | Массивы также называются списками, последовательностями или кортежами. Длина обозначает количество элементов данных в массиве, а не длину байта. | |||
От 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 | Крошечный | |||
Карта пар элементов данных | 5 | 0b101 | Карта пар элементов данных. Карты также называются таблицами, словарями, хешами или объектами (в 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 | Крошечный | |||
Семантический тег | 6 | 0b110 | Используется для необязательной семантической маркировки других основных типов | |||
Поле значения представляет идентификатор тега: см. 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 | ... | |||
Примитивы например перемена, плавать, простые значения | 7 | 0b111 | числа с плавающей запятой и простые типы данных, не нуждающиеся в содержании, а также код остановки "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 754 | 5 | короткий | |||
27 | Следующие 8 байтов - это uint64_t как число с плавающей запятой двойной точности IEEE 754 | 9 | короткий | |||
28 | Не назначен | |||||
29 | ||||||
30 | ||||||
31 | "прерывание" кода остановки для элементов неопределенной длины | 1 | Крошечный |
- Байт = 8 бит
Примитивы (основной тип = 7)
Основной тип примитивов имеет значение основного типа 7. Он используется для простых типов данных, общих сложных типов с плавающей запятой, а также для управляющего кода.
Основной тип | Дополнительная ценность | Дополнительные байты (при необходимости) | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
Байтов | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
Размер бит | 3 бита | 5 бит | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 |
Простое значение от 0 до 23 (значение X) | 7 | Х = 0 ... 23 | Не используется | |||||||
Простое значение от 24 до 255 (значение X) | 7 | 24 | Х = 32 ... 255 | Не используется | ||||||
IEEE 754 с плавающей запятой половинной точности (следуют 16 бит) | 7 | 25 | 16 бит IEEE 754 | Не используется | ||||||
IEEE 754 с плавающей точкой одинарной точности (далее следует 32 бита) | 7 | 26 | 32 бит IEEE 754 | Не используется | ||||||
IEEE 754 с плавающей запятой двойной точности (далее следует 64 бита) | 7 | 27 | 64 бит IEEE 754 | |||||||
Отрыв от неопределенного массива или карты | 7 | 31 | Не используется |
Код контроля прерывания (значение дополнительного типа = 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 | Павел Гульбин | PHP | PHP | https://github.com/2tvenom/CBOREncode | |
cbor | Фэй Амакер | Идти | Массачусетский технологический институт | https://github.com/fxamacker/cbor | Надежно и быстро, теги CBOR, float64 / 32/16, обнаружение дублирующихся ключей карты, API кодирует / json + toarray & keyasint struct теги, Canonical CBOR, CTAP2, проверено нечеткостью. |
cbor | Павел Гульбин | Идти | WTFPL | https://github.com/2tvenom/cbor | |
cbor_go | Брайан Олсон | Идти | APL 2.0 | https://github.com/brianolson/cbor_go | |
go-кодек | Угоржи Нвоки | Идти | Массачусетский технологический институт | https://godoc.org/github.com/ugorji/go/codec | Также обрабатывает JSON, MsgPack и BinC. |
serde_cbor | Pyfisch | Ржавчина | MIT или APL 2.0 | https://github.com/pyfisch/cbor | |
cbor-кодек | Торальф Виттнер | Ржавчина | MPL 2.0 | https://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 | Шон Коннер | Lua | LGPL-3 | https://github.com/spc476/CBOR | |
cbor_py | Брайан Олсон | Python | APL 2.0 | https://github.com/brianolson/cbor_py | |
Flynn | Фриц Конрад Гримпен | Python | Массачусетский технологический институт | https://github.com/fritz0705/flynn | |
cbor2 | Алекс Грёнхольм | Python | Массачусетский технологический институт | https://github.com/agronholm/cbor2 | |
CBOR :: Бесплатно | Фелипе Гаспер | Perl | Художественный и GPL | https://metacpan.org/pod/CBOR::Free | |
CBOR :: PP | Фелипе Гаспер | Perl | Художественный и GPL | https://metacpan.org/pod/CBOR::PP | |
CBOR :: XS | Марк Леманн | Perl | GPL-3 | https://metacpan.org/pod/CBOR::XS | |
cbor-ruby | Садаюки Фурухаси Карстен Борман | Рубин | APL 2.0 | https://github.com/cabo/cbor-ruby | |
libcbor-ruby | Павел Калвода | Рубин | Массачусетский технологический институт | https://github.com/PJK/libcbor-ruby | Привязка к libcbor. |
cbor-erlang | Джихён Ю | Erlang | BSD-3-пункт | https://github.com/yjh0502/cbor-erlang | |
Excbor | Карстен Борман | Эликсир | не указано, спроси автора | https://github.com/cabo/excbor | |
CBOR | Р. Кайл Мерфи | Haskell | LGPL-3 | https://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 # | Лицензия MIT | https://github.com/dahomey-technologies/Dahomey.Cbor | |
Джексон | Тату Салоранта | Ява | АПЛ-2.0 | https://github.com/FasterXML/jackson-dataformats-binary/tree/master/cbor | Также обрабатывает другие форматы. |
cbor-java | Константин Рэк | Ява | АПЛ-2.0 | https://github.com/c-rack/cbor-java | |
Джейкоб | J.W. Янссен | Ява | АПЛ-2.0 | https://github.com/jawi/jacob | |
kotlinx.serialization | JetBrains | Котлин | АПЛ-2.0 | https://github.com/Kotlin/kotlinx.serialization | Поддерживает кроссплатформенность |
cn-cbor | Джо Хильдебранд Карстен Борман | C | Массачусетский технологический институт | https://github.com/cabo/cn-cbor | |
cbor-cpp | Станислав Овсянников | C ++ | АПЛ-2.0 | https://github.com/naphaso/cbor-cpp | |
cppbor | Дэвид Прис | C ++ | BSD | https://github.com/rantydave/cppbor | Использует варианты C ++ 17. |
libcbor | Павел Калвода | C | Массачусетский технологический институт | https://github.com/PJK/libcbor | |
tinycbor | Intel | C | Массачусетский технологический институт | https://github.com/01org/tinycbor | |
NanoCBOR | Коэн Зандберг | C | LGPL | https://github.com/bergzand/NanoCBOR | Использован RIOT-OS |
cbor-d | Андрей Пенечко | D | Повышение 1.0 | https://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.0 | https://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 | |
QCborValue | Qt Project | C ++ | LGPL | https://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.0 | https://github.com/jjtara/Library-Arduino-Cbor | |
cborg | Дункан Куттс | Haskell | BSD-3-пункт | https://github.com/well-typed/cborg | |
cbor | Стив Хэмблетт | Дротик | Массачусетский технологический институт | https://github.com/shamblett/cbor | |
бурильщик | Матиас Дениц | Scala | MPL 2.0 | https://github.com/sirthias/borer | Также обрабатывает JSON. |
nim_cbor | Эмери Хемингуэй | Ним | Массачусетский технологический институт | https://git.sr.ht/~ehmry/nim_cbor | |
киборий | Натаниэль МакКаллум Марк Беставрос Команда Enarx | Ржавчина | Apache 2.0 | https://github.com/enarx/ciborium |
Смотрите также
Рекомендации
- ^ "CBOR - Краткое представление двоичных объектов | Обзор".
- ^ «CoAP - протокол приложений с ограничениями | Обзор».
- ^ «Проект FIDO2». ФИДО Альянс. Получено 2018-05-11.
- ^ RFC 8949. Дои:10.17487 / RFC8949.