КБОР
Расширение имени файла | .cbor |
---|---|
Тип интернет-СМИ | приложение/cbor |
Тип формата | Обмен данными |
Расширено с | Пакет сообщений |
Стандартный | RFC 8949 |
Открытый формат ? | Да |
Веб-сайт | cбор |
Краткое представление двоичных объектов ( CBOR ) — это формат сериализации двоичных данных , основанный на JSON, авторами которого являются Карстен Борман и Пол Хоффман. [а] Как и JSON, он позволяет передавать объекты данных, содержащие пары имя-значение , но в более краткой форме. Это увеличивает скорость обработки и передачи за счет удобочитаемости для человека . Это определено в IETF РФК 8949 . [2]
Помимо прочего, это рекомендуемый уровень сериализации данных для набора протоколов CoAP Интернета вещей. [3] [ не удалось пройти проверку ] и формат данных, на котором COSE основаны сообщения . Он также используется в протоколе клиент-аутентификатор (CTAP) в рамках проекта FIDO2. [4]
CBOR был вдохновлен MessagePack , который разработал и продвигал Садаюки Фурухаси. CBOR расширил MessagePack, в частности, позволив отличать текстовые строки от байтовых строк, что было реализовано в 2013 году в MessagePack. [5] [6]
Спецификация кодировки CBOR
[ редактировать ]Данные, закодированные CBOR, рассматриваются как поток элементов данных. Каждый элемент данных состоит из байта заголовка, содержащего 3-битный тип и 5-битный короткий счетчик. За этим следует необязательный расширенный счетчик (если короткий счетчик находится в диапазоне 24–27) и необязательная полезная нагрузка.
Для типов 0, 1 и 7 полезная нагрузка отсутствует; счетчик — это значение. Для типов 2 (байтовая строка) и 3 (текстовая строка) счетчиком является длина полезных данных. Для типов 4 (массив) и 5 (карта) счетчиком является количество элементов (пар) в полезных данных. Для типа 6 (тег) полезная нагрузка представляет собой один элемент, а счетчик представляет собой числовой номер тега, который описывает вложенный элемент.
Данные ЦБОР | Элемент данных 1 | Элемент данных 2 | Элемент данных 3... | ||||||
---|---|---|---|---|---|---|---|---|---|
Количество байтов | 1 байт (заголовок элемента данных CBOR) | Переменная | Переменная | 1 байт (заголовок элемента данных CBOR) | Переменная | Переменная | и т. д... | ||
Структура | Основной тип | Короткий счет | Расширенный счет (необязательно) | Полезная нагрузка данных (необязательно) | Основной тип | Короткий счет | Расширенный счет (необязательно) | Полезная нагрузка данных (необязательно) | и т. д... |
Количество битов | 3 бита | 5 бит | 8 бит × переменная | 8 бит × переменная | 3 бита | 5 бит | 8 бит × переменная | 8 бит × переменная | и т. д.. |
Обработка основных типов и количества в каждом элементе данных
[ редактировать ]Поведение каждого элемента данных определяется основным типом и количеством. Основной тип используется для выбора основного поведения или типа каждого элемента данных.
5-битное поле короткого счета напрямую кодирует значения от 0 до 23. Короткие значения 24–27 указывают, что значение счетчика находится в следующем 8, 16, 32 или 64-битном расширенном поле счета. Значения 28–30 не назначены и не должны использоваться.
Типы делятся на «атомарные» типы 0–1 и 6–7, для которых поле счетчика кодирует значение напрямую, и неатомарные типы 2–5, для которых поле счетчика кодирует размер следующего поля полезной нагрузки.
Короткий счет 31 используется с неатомными типами 2–5 для обозначения неопределенной длины; полезная нагрузка представляет собой следующие элементы до байта маркера «разрыва», равного 255 (тип = 7, короткий счетчик = 31). Короткий счет 31 не допускается с другими атомными типами 0, 1 или 6.
Тип 6 (тег) необычен тем, что его поле счетчика напрямую кодирует значение, но также имеет поле полезной нагрузки (которое всегда состоит из одного элемента).
Расширенные счетчики и все многобайтовые значения кодируются в сетевом (обратном порядке байтов) .
Кодировка поля элемента данных CBOR
[ редактировать ]Кодирование крошечных полей
[ редактировать ]Количество байтов | 1 байт (заголовок элемента данных CBOR) | |
---|---|---|
Структура | Основной тип | Короткий счет (значение) |
Количество битов | 3 бита | 5 бит |
Атом | 0–1, 7 | 0–23 |
Маркер разрыва | 7 | 31 |
Кодирование коротких полей
[ редактировать ]Количество байтов | 1 байт (заголовок элемента данных CBOR) | Переменная | |
---|---|---|---|
Структура | Основной тип | Короткий счет | Ценить |
Количество битов | 3 бита | 5 бит | 8 бит × переменная |
Атом | 0–1, 7 | 24–27 | 8, 16, 32 или 64 бита |
Нить | 2–3 | 0–23 | количество × 8 бит |
Предметы | 4–5 | 0–23 | количество × предметов/пар |
Ярлык | 6 | 0–23 | один предмет |
Кодирование длинных полей
[ редактировать ]Количество байтов | 1 байт (заголовок элемента данных CBOR) | 1, 2, 4 или 8 байт | Переменная | |
---|---|---|---|---|
Структура | Основной тип | Короткий счет (24–27) | Расширенный счет (длина полезной нагрузки) | Ценить |
Количество битов | 3 бита | 5 бит | 8, 16, 32 или 64 бита | 8 бит × переменная |
Нить | 2–3 | 24–27 | До 2 64 −1 | количество × 8 бит |
Предметы | 4–5 | 24–27 | До 2 64 −1 | количество × предметов/пар |
Ярлык | 6 | 24–27 | Тег, до 2 64 −1 | один предмет |
Целые числа (типы 0 и 1)
[ редактировать ]Для целых чисел поле счетчика представляет собой значение; полезной нагрузки нет. Тип 0 кодирует положительные или беззнаковые целые числа со значениями до 2. 64 −1. Тип 1 кодирует отрицательные целые числа со значением −1-count для значений от −2. 64 до −1.
Строки (типы 2 и 3)
[ редактировать ]Типы 2 и 3 имеют поле счетчика, которое кодирует длину полезной нагрузки в байтах. Тип 2 представляет собой неструктурированную строку байтов. Тип 3 — это текстовая строка UTF-8 .
Короткое число 31 указывает на строку неопределенной длины. За этим следует ноль или более строк определенной длины того же типа, завершающихся байтом-маркером «разрыва». Значение элемента представляет собой объединение значений вложенных элементов. Элементы другого типа или вложенные строки неопределенной длины не допускаются. Текстовые строки должны иметь правильный формат; Символы UTF-8 не могут быть разделены по элементам.
Массивы и карты (типы 4 и 5)
[ редактировать ]Тип 4 имеет поле счетчика, кодирующее количество следующих элементов, за которыми следует такое же количество элементов. Не обязательно все предметы должны быть одного типа; в некоторых языках программирования это называется «кортеж», а не «массив».
Альтернативно может использоваться кодирование неопределенной длины с коротким счетчиком 31. Это продолжается до тех пор, пока не появится байт маркера разрыва 255. Поскольку вложенные элементы также могут использовать неопределенную кодировку, синтаксический анализатор должен соединить маркеры разрыва с соответствующими байтами заголовка неопределенной длины.
Тип 5 аналогичен, но кодирует карту (также называемую словарем или ассоциативным массивом) пар ключ/значение. В этом случае счетчик кодирует количество пар элементов. Если используется кодировка неопределенной длины, перед байтом маркера «разрыва» должно быть четное количество элементов.
Семантический тег (тип 6)
[ редактировать ]Семантический тег — это еще один атомарный тип, для которого счетчик является значением, но он также имеет полезную нагрузку (один следующий элемент), и оба они считаются одним элементом, например, в массиве или на карте.
Номер тега предоставляет дополнительную информацию о типе следующего элемента, помимо той, которую может предоставить 3-битный основной тип. Например, тег 1 указывает, что следующее число является значением времени Unix . Тег 2 указывает, что следующая строка байтов кодирует беззнаковое большое число . Тег 32 указывает, что следующая текстовая строка является URI , как определено в РФК 3986 . RFC 8746 определяет теги 64–87 для кодирования однородных массивов целых чисел фиксированного размера или значений с плавающей запятой в виде байтовых строк.
Тег 55799 обозначает «следуют данные CBOR». Это семантический запрет , но позволяет использовать соответствующие байты тегов. d9 d9 f7
быть добавленным к файлу CBOR, не влияя на его значение. Эти байты можно использовать как « магическое число », чтобы отличить начало данных CBOR.
Значения тегов «все единицы» 0xffff, 0xffffffff и 0xffffffffffffffff зарезервированы для обозначения отсутствия тега в библиотеке декодирования CBOR; они никогда не должны появляться в потоке данных.
Псевдоэлемент маркера разрыва не может быть полезной нагрузкой тега.
Специальный/поплавковый (тип 7)
[ редактировать ]Этот основной тип используется для кодирования различных специальных значений, которые не попадают в другие категории. Он следует тем же правилам размера кодировки, что и другие атомарные типы (0, 1 и 6), но поле счетчика интерпретируется по-другому.
Значения 20–23 используются для кодирования специальных значений false, true, null и undefined . Значения 0–19 в настоящее время не определены.
Короткий счетчик 24 указывает на то, что за ним следует 1-байтовый расширенный счетчик, который можно использовать в будущем для кодирования дополнительных специальных значений. Чтобы упростить декодирование, значения 0–31 можно не кодировать в этой форме. Ни одно из значений 32–255 в настоящее время не определено.
Короткие значения 25, 26 или 27 указывают на то, что следующее расширенное поле счетчика должно интерпретироваться как (с обратным порядком байтов) 16-, 32- или 64-битное значение IEEE с плавающей запятой . Это те же размеры, что и расширенный счетчик, но интерпретируются по-другому. В частности, для всех остальных основных типов 2-байтовый расширенный счетчик 0x1234 и 4-байтовый расширенный счетчик 0x00001234 абсолютно эквивалентны. Это не относится к значениям с плавающей запятой.
Короткие счета 28–30 зарезервированы, как и для всех остальных основных типов.
Короткое число 31 кодирует специальный маркер «разрыва», который завершает кодирование неопределенной длины. Это связано с использованием других основных типов, где короткий счетчик 31 начинает кодирование неопределенной длины, но отличается от него. Это не элемент и может не отображаться в полезных данных определенной длины.
Регистрация семантического тега
[ редактировать ]IANA создало реестр тегов CBOR, расположенный по адресу https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml . Регистрации должны содержать шаблон, описанный ниже. [7]
Тип семантического тега | Диапазон | Шаблон | |||
---|---|---|---|---|---|
Элемент данных | Семантика (краткая форма) | Контактное лицо | Описание семантики (URL) | ||
Стандартные действия | 0–23 | Необходимый | Необходимый | — | — |
Требуется спецификация | 24–255 | Необходимый | Необходимый | — | — |
В порядке очереди обслужено | 256–18446744073709551615 | Необходимый | Необходимый | Необходимый | Описание не является обязательным. URL-адрес может указывать на Интернет-черновик или веб-страницу. |
Реализации
[ редактировать ]Имя | Основной автор | Язык | Лицензия | Источник | Примечания | |
---|---|---|---|---|---|---|
cбор | Кёнхван Квон | С | С | https://github.com/mononn/cbor | ||
ККБОР | Лоуренс Лундблейд | С | С | https://github.com/laurencelundblade/QCBOR | ||
cbor-js | Патрик Ганстерер | JavaScript | С | https://github.com/paroga/cbor-js | ||
узел-cbor | Джо Хильдебранд | JavaScript | С | https://github.com/hildjj/node-cbor | ||
CBOEncode | Павел Гульбин | PHP | PHP | https://github.com/2tvenom/CBOREncode | ||
cbor-php | Флоран Морселли | PHP | С | https://github.com/Spomky-Labs/cbor-php | ||
fxamacker/cbor | Фэй Амакер | Идти | С | https://github.com/fxamacker/cbor | Fuzz-тестирование, RFC 8949, теги CBOR, базовое детерминированное кодирование, float64/32/16, обнаружение повторяющихся ключей карты, теги API-кодирования/json + toarray и keyasint и т. д. | |
cбор | Павел Гульбин | Идти | ВТФПЛ | https://github.com/2tvenom/cbor | ||
cbor_go | Брайан Олсон | Идти | АПЛ 2.0 | https://github.com/brianolson/cbor_go | ||
go-кодек | Угоржи Нвоке | Идти | С | https://godoc.org/github.com/ugorji/go/codec | Также обрабатывает JSON, MsgPack и BinC. | |
го-cбор | Сатоши Конно | Идти | АПЛ 2.0 | https://github.com/cybergarage/go-cbor | ||
serde_cbor | Пюфиш | Ржавчина | Массачусетский технологический институт или APL 2.0 | https://github.com/pyfisch/cbor | ||
cbor-кодек | Торальф Виттнер | Ржавчина | МПЛ 2.0 | https://twittner.gitlab.io/cbor-codec/cbor/ | ||
SwiftCBOR | greg@ неумолимая.технология | Быстрый | Отменить лицензию | https://github.com/unrelentingtech/SwiftCBOR | ||
CBOR.jl | Саурав Сачидананд | Юлия | С | https://github.com/saurvs/CBOR.jl | ||
Цитата-CBOR | Ким Альвефур | Два | С | https://www.zash.se/lua-cbor.html | ||
org.conman.cbor | Шон Коннер | Два | ГНУ ЛГПЛ -3 | https://github.com/spc476/CBOR | ||
cbor_py | Брайан Олсон | Питон | АПЛ 2.0 | https://github.com/brianolson/cbor_py | ||
Флинн | Фриц Конрад Гримпен | Питон | С | https://github.com/fritz0705/flynn | ||
cbor2 | Алекс Грёнхольм | Питон | С | https://github.com/agronholm/cbor2 | ||
CBOR::Бесплатно | Фелипе Гаспер | Перл | GNU GPL и художественное оформление | https://metacpan.org/pod/CBOR::Free | ||
КБОР::ПП | Фелипе Гаспер | Перл | GNU GPL и художественное оформление | https://metacpan.org/pod/CBOR::PP | ||
КБОР::XS | Марк Леманн | Перл | GNU GPL -3 | https://metacpan.org/pod/CBOR::XS | ||
cbor-рубин | Садаюки Фурухаси Карстен Борман | Руби | АПЛ 2.0 | https://github.com/cabo/cbor-ruby | ||
libcbor-Ruby | Павел Кальвода | Руби | С | https://github.com/PJK/libcbor-ruby | Привязка к libcbor. | |
cbor-erlang | Jihyun Yu | Эрланг | BSD -3-пункт | https://github.com/yjh0502/cbor-erlang | ||
Эксбор | Карстен Борман | Эликсир | не указан, спроси у автора | https://github.com/cabo/excbor | ||
маленький медвежонок | Джеймс Вудятт | OCaml | BSD -2-пункт | https://bitbucket.org/jhw/orsetto/ | также обрабатывает другие форматы ( JSON , Base32 , Base64 , URI , TAI64 ) | |
cбор | янгрек | OCaml | С | https://github.com/ygrek/ocaml-cbor | ||
КБОР | Р. Кайл Мерфи | Хаскелл | ГНУ ЛГПЛ -3 | https://github.com/orclev/CBOR | ||
долг | Джо Хильдебранд Фридель Зигельмайер | JavaScript | С | https://github.com/dignifiedquire/borc | Форк node-cbor. | |
Borc-refs | Джо Хильдебранд Фридель Зигельмайер Сандро Хоук | JavaScript | С | https://github.com/sandhawke/borc-refs | Вилка борца. | |
КБОР | Питер Оксил | С# | Программное обеспечение, являющееся общественным достоянием | https://github.com/peteroupc/CBOR | Также обрабатывает JSON. | |
Дагомея.Cbor | Микаэль Катанзарити | С# | МОЯ лицензия | 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 | ||
Джейкоб | Дж. В. Янссен | Ява | АПЛ-2.0 | https://github.com/jawi/jacob | ||
Котлинкс.сериализация | JetBrains | Котлин | АПЛ-2.0 | https://github.com/Kotlin/kotlinx.serialization | Поддерживает кроссплатформенность | |
cn-cbor | Джо Хильдебранд Карстен Борман | С | С | https://github.com/cabo/cn-cbor | ||
cbor-cpp | Станислав Овсянников | С++ | АПЛ-2.0 | https://github.com/naphaso/cbor-cpp | ||
cppbor | Дэвид Прис | С++ | БСД | https://github.com/rantydave/cppbor | Использует варианты C++17. | |
libcbor | Павел Кальвода | С | С | https://github.com/PJK/libcbor | ||
Тиникбор | Интел | С | С | https://github.com/01org/tinycbor | ||
НаноКБОР | Коэн Зандберг | С | Общественное достояние | https://github.com/bergzand/NanoCBOR | Используется РИОТ-ОС | |
cbor-e | Андрей Пенечко | Д | Повышение 1.0 | https://github.com/MrSmith33/cbor-d | ||
clj-cbor | Грег Лук | Кложур | Отменить лицензию | https://github.com/greglook/clj-cbor | ||
JSON для современного C++ | Нильс Ломанн | С++ | С | https://github.com/nlohmann/json | Также обрабатывает JSON и MsgPack. | |
Бора-Бора | Кристоф Энгельберт | Ява | АПЛ-2.0 | https://github.com/noctarius/borabora | ||
lua-Краткая сериализация | Франсуа Перрад | Два | С | https://fperrad.frama.io/lua-ConciseSerialization/ | ||
фланн | Фриц Конрад Гримпен Sokolov Yura | Питон | С | https://pypi.python.org/pypi/flunn | ||
cbor-qt | Антон Дутов | С++ | Общественное достояние | https://github.com/anton-dutov/cbor-qt | ||
QCborValue | Qt-проект | С++ | ГНУ ЛГПЛ | https://doc.qt.io/qt-5/qcborvalue.html | Часть платформы Qt , начиная с версии 5.12. | |
cbor11 | Якоб Вармос Бентцен | С++ | Общественное достояние | https://github.com/jakobvarmose/cbor11 | ||
cborcpp | Алексей Некипелов | С++ | С | https://github.com/nekipelov/cborcpp | ||
Золотая Рыбка | Винсент Ласко | С++ | С | https://github.com/OneNoteDev/GoldFish | ||
Библиотека-Arduino-Cbor | Хуанхо Тара | С++ | АПЛ-2.0 | https://github.com/jjtara/Library-Arduino-Cbor | ||
cборг | Дункан Куттс | Хаскелл | BSD -3-пункт | https://github.com/well-typed/cborg | ||
cбор | Стив Хэмблетт | Дарт | С | https://github.com/shamblett/cbor | ||
бурильщик | Матиас Дениц | Скала | МПЛ 2.0 | https://github.com/sirthias/borer | Также обрабатывает JSON. | |
ним_cbor | Эмери Хемингуэй | Nim | С | https://git.sr.ht/~ehmry/nim_cbor | ||
циборий | Натаниэль МакКаллум Марк Беставрос Команда Энаркс | Ржавчина | Апач 2.0 | https://github.com/enarx/ciborium | ||
cбор | Пауло Моура | Логток | Апач 2.0 | https://github.com/LogtalkDotOrg/logtalk3/tree/master/library/cbor | Часть дистрибутива Logtalk; также можно использовать из Пролога | |
System.Formats.Cbor | Команда .NET | С# | С | https://github.com/dotnet/runtime/blob/main/src/libraries/System.Formats.Cbor | Часть .NET 5+ | |
DelphiCBOR | микерабат | Дельфи | Лицензия Апач 2.0 | https://github.com/mikerabat/DelphiCBOR | ||
Динамические данныеОбъекты | Шон Сольберг | Дельфи | С | https://github.com/SeanSolberg/DynamicDataObjects | Также обрабатывает JSON, MsgPack, BSON, BinaryJData, CSV, DDO, EBML, ICS, ION, Smile и UBJSON. | |
хор | Дэвид Шугар | Зиг | С | https://github.com/r4gus/zbor | ||
минибор | Торальф Виттнер | Ржавчина | Лицензия на модель Blue Oak | https://gitlab.com/twittner/minicbor | Можно использовать без полной стандартной библиотеки Rust и, с некоторыми ограничениями, без динамического распределителя памяти. |
См. также
[ редактировать ]Примечания
[ редактировать ]Ссылки
[ редактировать ]- ^ Борман, Карстен; Хоффман, Пол (28 июля 2013 г.). «Проектирование и обзор CBOR» (PDF) . Материалы IETF .
- ^ «CBOR — Краткое представление двоичных объектов | Обзор» .
- ^ «CoAP — протокол ограниченных приложений | Обзор» . Архивировано из оригинала 3 января 2017 г. Проверено 28 августа 2016 г.
- ^ «Проект ФИДО2» . Альянс ФИДО . Проверено 11 мая 2018 г.
- ^ «Обсуждение предстоящей спецификации MessagePack, которая добавит в протокол строковый тип» . Гитхаб . Проверено 4 января 2022 г.
- ^ Борман, Карстен; Хоффман, Пол Э. (декабрь 2020 г.). «RFC 8949: Краткое представление двоичных объектов (CBOR)» . IETF.
- ^ Борман, Карстен; Хоффман, Пол Э. (декабрь 2020 г.). «RFC 8949: Краткое представление двоичных объектов (CBOR)» .
Внешние ссылки
[ редактировать ]- Онлайн-инструмент для преобразования двоичного формата CBOR в текстовое представление и обратно.
- Зона CBOR : онлайн-инструмент для преобразования элемента CBOR или последовательности CBOR в формате HEX, Base64, Base64URL или диагностической нотации CBOR в другой формат.