Расширение имени файла | .cbor |
---|---|
Тип Интернет-носителя | приложение / cbor |
Тип формата | Обмен данными |
Стандартный | RFC 7049 |
Открытый формат ? | Да |
Веб-сайт | cbor.io |
Краткое представление двоичного объекта (CBOR ) - это формат двоичных данных сериализации, основанный на JSON. Как и JSON, он позволяет передавать объекты данных, которые содержат пары имя – значение, но более кратко. Это увеличивает скорость обработки и передачи за счет удобочитаемости. Он определен в IETF RFC 7049.
Среди прочего, это рекомендуемый уровень сериализации данных для набора протоколов CoAP Интернета вещей и данных формат, на котором основаны сообщения. Он также используется в протоколе клиент-аутентификатор (CTAP) в рамках проекта FIDO2.
CBOR-кодирование данные рассматриваются как поток элементов данных. Например.
Данные CBOR | Элемент данных 1 | Элемент данных 2 | Элемент данных X... | ||||||
---|---|---|---|---|---|---|---|---|---|
Количество байтов | 1 байт (CBOR заголовок элемента данных) | Переменная | Переменная | 1 байт (заголовок элемента данных CBOR) | Переменная | Переменная | и т. Д... | ||
Структура | Основной тип | Дополнительная информация | Длина полезной нагрузки (необязательно) | Полезная нагрузка данных (необязательно) | Основной тип | Дополнительная информация | Длина полезной нагрузки (необязательно) | Полезная нагрузка данных (необязательно) | и т. Д. |
бит count | 3 бита | 5 бит | 8 бит × переменная | 8 битов × переменная | 3 бита | 5 бит | 8 бит × переменная | 8 бит × переменная | и т. Д. |
Поведение каждого элемента данных определяется основным типом и дополнительным типом. Основной тип используется для выбора основного поведения или типа каждого элемента данных.
Дополнительный тип - это дополнительная информация, точное поведение которой зависит от значения основного типа.
Количество байтов | 1 байт (заголовок элемента данных CBOR) | |
---|---|---|
Структура | Главный тип | Дополнительная информация (значение) |
Количество бит | 3 бита | 5 бит |
Количество байтов | 1 байт (заголовок элемента данных CBOR) | Переменная | |
---|---|---|---|
Структура | Основной тип | Дополнительная информация | Значение |
Количество битов | 3 бита | 5 бит | 8 бит × (Value_Field_Byte_Count) |
Количество байтов | 1 байт (заголовок элемента данных CBOR) | Переменная | Переменная | |
---|---|---|---|---|
Структура | Основной тип | Дополнительная информация (Размер поля длины) | Длина полезной нагрузки (Длина Of Value Field) | Value |
Количество битов | 3 бита | 5 бит | 8 бит × (Length_Field_Byte_Count) | 8 бит × (Value_Field_Byte_Count) |
В таблице ниже показано, как работает заголовок элемента данных CBOR. кс.
Основной тип | Значение основного типа | Значение дополнительного типа (без знака) | Значение дополнительного типа | Размер элемента в байтах | Тип кодирования поля | |
---|---|---|---|---|---|---|
Положительное / беззнаковое целое | 0 | 0b000 | 5-битная дополнительная информация представляет собой либо само целое число (для значений дополнительной информации от 0 до 23), либо длину дополнительных данных. | |||
от 0 до 23 (от 0x0 до 0x17) (от 0b00000 до 0b10111) | Используется непосредственно как значение данных. Таким образом, сохраняя компактный размер. | 1 | Tiny | |||
24 | Следующий байт - uint8_t в разделе значений данных | 2 | Short | |||
25 | Следующие 2 байта uint16_t в разделе значений данных | 3 | Short | |||
26 | Следующие 4 байта - uint32_t в разделе значений данных | 5 | Short | |||
27 | Следующие 8 байтов - uint64_t в разделе значений данных | 9 | Short | |||
... | ... | ... | ... | |||
31 | ... | ... | ... | |||
Отрицательное целое число | 1 | 0b001 | Кодирование следует правилам для целых чисел без знака (основной тип 0), за исключением того, что тогда значение равно -1 минус закодированное целое число без знака. | |||
От 0 до 23 (от 0x0 до 0x17) (от 0b00000 до 0b10111) | Используется непосредственно как значение данных. Таким образом, сохраняя компактный размер. | 1 | Tiny | |||
24 | Следующий байт - uint8_t в разделе значений данных | 2 | Short | |||
25 | Следующие 2 байта uint16_t в разделе значений данных | 3 | Short | |||
26 | Следующие 4 байта - uint32_t в разделе значений данных | 5 | Short | |||
27 | Следующие 8 байтов - uint64_t в разделе значений данных | 9 | Short | |||
... | ... | ... | ... | |||
31 | ... | ... | ... | |||
Байтовая строка | 2 | 0b010 | Длина строки в байтах представляется в соответствии с правилами для положительных целых чисел (основной тип 0). | |||
от 0 до 23 (от 0x0 до 0x17) (от 0b00000 до 0b10111) | Используется непосредственно как спецификатор длины данных. Таким образом, сохраняя компактный размер. | до 1 + 23 | Short | |||
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 | Long | |||
... | ... | ... | ... | |||
31 | Начало неопределенной строки: объединение строк определенной длины до следующего соответствующего кода «разрыва». | 1 | Tiny | |||
Текстовая строка | 3 | 0b011 | Текстовая строка, в частности строка символов Unicode, закодированная как UTF-8 [RFC3629]. | |||
от 0 до 23 (от 0x0 до 0x17) (0b00000 to 0b10111) | Используется непосредственно как спецификатор длины данных. Таким образом, сохраняя компактный размер. | до 1 + 23 | Short | |||
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 | Long | |||
... | ... | ... | ... | |||
31 | Начало неопределенной строки: конкатенация строк определенной длины до следующего соответствующего кода «прерывания». | 1 | Tiny | |||
Массив элементов данных | 4 | 0b100 | Массивы также называются списками, последовательностями или кортежами. Длина обозначает количество элементов данных в массиве, а не длину байта. | |||
От 0 до 23 (от 0x0 до 0x17) (от 0b00000 до 0b10111) | Используется непосредственно как спецификатор количества элементов. Таким образом, сохраняя компактный размер. | 1 | Tiny | |||
24 | Следующий байт - uint8_t для длины полезной нагрузки | 2 | Short | |||
25 | Следующие 2 байта uint16_t для длины полезной нагрузки | 3 | Short | |||
26 | Следующие 4 байта - uint32_t для длины полезной нагрузки | 5 | Short | |||
27 | Следующие 8 байтов - uint64_t для длины полезной нагрузки | 9 | Short | |||
... | ... | ... | ... | |||
31 | Начало неопределенного массива до следующего соответствующего кода «прерывания». | 1 | Tiny | |||
Карта пар элементов данных | 5 | 0b101 | Карта пар элементов данных. Карты также называются таблицами, словарями, хешами или объектами (в JSON). Длина обозначает количество пар элементов данных, а не длину байта. Каждая запись карты принимает два элемента данных в последовательном порядке, элемент данных ключа и элемент данных значения. | |||
от 0 до 23 (от 0x0 до 0x17) (от 0b00000 до 0b10111) | Используется непосредственно в качестве спецификатора количества элементов. Таким образом, сохраняя компактный размер. | 1 | Tiny | |||
24 | Следующий байт - uint8_t для длины полезной нагрузки | 2 | Short | |||
25 | Следующие 2 байта uint16_t для длины полезной нагрузки | 3 | Short | |||
26 | Следующие 4 байта - uint32_t для длины полезной нагрузки | 5 | Short | |||
27 | Следующие 8 байтов - uint64_t для длины полезной нагрузки | 9 | Short | |||
... | ... | ... | ... | |||
31 | Начало неопределенного отображения до следующего соответствующего кода «разрыва». | 1 | Крошечный | |||
семантический тег | 6 | 0b110 | Используется для необязательного семантического тегирования других основных типов | |||
Поле значения представляет идентификатор тега: см. https://www.iana.org/assignments /cbor-tags/cbor-tags.xhtml для семантического значения каждого тега. | ||||||
от 0 до 23 (от 0x0 до 0x17) (от 0b00000 до 0b10111) | Используется непосредственно как значение данных. Таким образом, сохраняя компактный размер. | 1 | Tiny | |||
24 | Следующий байт - uint8_t в разделе значений данных | 2 | Short | |||
25 | Следующие 2 байта uint16_t в разделе значений данных | 3 | Short | |||
26 | Следующие 4 байта - uint32_t в разделе значений данных | 5 | Short | |||
27 | Следующие 8 байтов - uint64_t в разделе значений данных | 9 | Short | |||
... | ... | ... | ... | |||
31 | ... | 1 | ... | |||
Примитивы например break, float, простые значения | 7 | 0b111 | числа с плавающей запятой и простые типы данных, которые не нуждаются в содержании, а также код остановки «break» | |||
0..19 | (не назначено) | 1 | Tiny | |||
20 | False | 1 | Tiny | |||
21 | True | 1 | Tiny | |||
22 | Null | 1 | Tiny | |||
23 | Undefined | 1 | Tiny | |||
24 | Следующий байт - uint8_t как простое значение (значение 32..255) <277 | 5 | Short | |||
27 | Следующие 8 байтов - uint64_t как IEEE 754 с плавающей запятой двойной точности | 9 | Short | |||
28 | Unassigned | |||||
29 | ||||||
30 | ||||||
31 | стоп-код "break" для элементов неопределенной длины | 1 | Tiny |
Основной тип примитивов имеет значение основного типа 7. Оно используется для простых типов данных, общих сложных типов с плавающей запятой, а также для управляющего кода.
Основной тип | Дополнительное значение | Дополнительные байты (если требуются) | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
Байты | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
Размер бита | 3 бита | 5 бит | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 |
Простое значение от 0 до 23 (значение X) | 7 | X = 0... 23 | Не используется | |||||||
Простое значение от 24 до 255 (значение X) | 7 | 24 | X = 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 | Не используется |
Это мета-значение, которое используется вместе с массивами и картами, установленными в режим неопределенной длины. Это указывает синтаксическому анализатору CBOR закрыть соответствующий уровень карты или массива.
Это позволяет хранить числа с плавающей запятой, закодированные как значения с плавающей запятой IEEE 754.
Большинство простых значений либо не присвоены, либо зарезервированы для будущих улучшений.
Однако они определены.
Простое значение | Семантическое |
---|---|
20 | Логическое ложное |
21 | Логическое истинное |
22 | Нулевое |
23 | Неопределенный |
IANA создала реестр тегов CBOR, расположенный в https://www.iana.org/assignments/cbor-tags/cbor -tags.xhtml. Регистрация должна содержать эти шаблоны.
Тип семантического тега | Диапазон | Шаблон | |||
---|---|---|---|---|---|
Элемент данных | Семантическое описание (краткая форма) | Контактное лицо | Описание семантики (URL) | ||
Стандартные действия | 0–23 | Обязательно | Обязательно | Н / Д | Н / Д |
Требуется спецификация | 24–255 | Требуется | Требуется | Н / Д | Н / Д |
Обслуживается в порядке очереди | 256–18446744073709551615 | Обязательно | Обязательно | Обязательно | Описание необязательно. URL-адрес может указывать на Интернет-проект или веб-страницу. |
https://tools.ietf.org/html/rfc7049#section-7.2
Имя | Основной автор | Язык | Лицензия | Источник | Примечания |
---|---|---|---|---|---|
cbor-js | Патрик Ганстерер | JavaScript | MIT | https://github.com/paroga/cbor-js | |
node-cbor | Джо Хильдебранд | JavaScript | MIT | https://github.com/hildjj/node-cbor | |
CBOREncode | Павел Гулбин | PHP | PHP | https://github.com/2tvenom/CBOREncode | |
cbor | Фэй Амакер | Go | MIT | https://github.com/fxamacker/cbor | Безопасный и быстрый, теги CBOR, float64 / 32/16, обнаружение дублирующихся ключей карты, API кодирует / json + Структурные теги toarray и keyasint, канонический CBOR, CTAP2, тестирование нечеткости. |
cbor | Павел Гулбин | Go | WTFPL | https://github.com/2tvenom/cbor | |
cbor_go | Брайан Олсон | Go | APL 2.0 | https://github.com/brianolson/cbor_go | |
go-codec | Ugorji Nwoke | Go | MIT | https://godoc.org/github.com/ugorji/go/codec | Также обрабатывает JSON, MsgPack и BinC. |
serde_cbor | Pyfisch | Rust | MIT или APL 2.0 | https://github.com/pyfisch/cbor | |
cbor-codec | Торальф Виттнер | Руст | MPL 2.0 | https://twittner.gitlab.io/cbor-codec/cbor/ | |
SwiftCBOR | [email#160;protected] | Swift | Без лицензии | https://github.com/myfreeweb/SwiftCBOR | |
CBOR.jl | Саурав Сачидананд | Джулия | MIT | https://github.com/saurvs/CBOR.jl | |
Lua-CBOR | Kim Alvefur | Lua | MIT | 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 | MIT | https://github.com/fritz0705/flynn | |
cbor2 | Алекс Гронхольм | Python | MIT | https://github.com/agronholm/cbor2 | |
CBOR :: Free | Фелипе Гаспер | П erl | Художественный и 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 | Павел Калвода | Ruby | MIT | https://github.com/PJK/libcbor-ruby | Привязка к libcbor. |
cbor-erlang | Jihyun Yu | Erlang | BSD-3-clause | https://github.com/yjh0502/cbor-erlang | |
excbor | Carsten Bormann | Elixir | не указано, спросить автора | https://github.com/cabo/excbor | |
CBOR | Р. Кайл Мерфи | Хаскелл | LGPL-3 | https://github.com/orclev/CBOR | |
borc | Джо Хильдебранд Фридель Зигельмайер | JavaScript | MIT | https://github.com/dignifiedquire/borc | Форк node-cbor. |
borc-refs | Джо Хильдебранд Фридель Зигельмайер Сандро Хоук | JavaScript | MIT | 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 | |
Джексон | Тату Салоранта | Java | APL-2.0 | https://github.com/FasterXML/jackson-dataformats-binary/tree/master/cbor | Также обрабатывает другие форматы. |
cbor-java | Constantin Rack | Java | APL-2.0 | https://github.com/c-rack/cbor-java | |
Джейкоб | JW Janssen | Java | APL-2.0 | https://github.com/jawi/jacob | |
kotlinx.serialization | JetBrains | Kotlin | APL-2.0 | https://github.com/Kotlin/kotlinx.serialization | Поддерживает кросс-платформенный |
cn-cbor | Джо Хильдебранд Карстен Борман | C | MIT | https://github.com/cabo/cn-cbor | |
cbor-cpp | Станислав Овсянников | C ++ | APL -2.0 | https://github.com/naphaso/cbor-cpp | |
cppbor | Дэвид Прис | C ++ | BSD | https: / /github.com/rantydave/cppbor | Использует варианты C ++ 17. |
libcbor | Павел Калвода | C | MIT | https://github.com/PJK/libcbor | |
tinycbor | Intel | C | MIT | https: //github.com/01org/tinycbor | |
NanoCBOR | Коэн Зандберг | C | LGPL | https://github.com/bergzand/NanoCBOR | Используется RIOT-OS |
cbor-d | Андрей Пенечко | D | Boost 1.0 | https://github.com/MrSmith33/cbor-d | |
clj-cbor | Грег Лук | Clojure | Без лицензии | https://github.com/greglook/clj-cbor | |
JSON для современного C ++ | Нильс Ломанн | C ++ | MIT | https://github.com/nlohmann/json | Также обрабатывает JSON и MsgPack. |
borabora | Кристоф Энгельберт | Java | APL-2.0 | https://github.com/noctarius/borabora | |
lua-ConciseSerialization | Франсуа Перрад | Lua | MIT | https://web.archive.org/web/20170322112326/https://fperrad.github.io/lua-ConciseSerialization / | |
flunn | Фриц Конрад Гримпен Соколов Юра | Python | MIT | 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 ++ | MIT | https://github.com/nekipelov/cborcpp | |
GoldFish | Винсент Ласко | C ++ | MIT | https://github.com/OneNoteDev/G oldFish | |
Library-Arduino-Cbor | Juanjo Tara | C ++ | APL-2.0 | https://github.com/jjtara/Library-Arduino- Cbor | |
cborg | Дункан Коуттс | Haskell | BSD-3-clause | https://github.com/well-typed/cborg | |
cbor | Стив Хэмблетт | Дарт | MIT | https://github.com/shamblett/cbor | |
borer | Матиас Дениц | Scala | MPL 2.0 | https://github.com/sirthias/borer | Также обрабатывает JSON. |
nim_cbor | Эмери Хемингуэй | Ним | MIT | https://git.sr.ht/~ehmry/nim_cbor |