CBOR

CBOR
Rozszerzenie nazwy pliku
.cbor
Rodzaj mediów internetowych
aplikacja/cbor
Typ formatu Wymiana danych
Przedłużony od Pakiet wiadomości
Standard   RFC8949 _
Otwarty format ? Tak
Strona internetowa cbor.io _

  Concise Binary Object Representation ( CBOR ) to binarny format serializacji danych luźno oparty na JSON autorstwa C. Bormanna. Podobnie jak JSON umożliwia przesyłanie obiektów danych zawierających pary nazwa-wartość , ale w bardziej zwięzły sposób. Zwiększa to szybkość przetwarzania i przesyłania kosztem czytelności dla człowieka . Jest to zdefiniowane w IETF RFC 8949 .

Jest to między innymi zalecana warstwa serializacji danych dla zestawu protokołów CoAP Internet of Things [ nieudana weryfikacja ] oraz format danych, na którym oparte są komunikaty COSE. Jest również używany w protokole Client-to-Authenticator Protocol (CTAP) w ramach projektu FIDO2.

CBOR został zainspirowany MessagePack , który został opracowany i promowany przez Sadayuki Furuhashi. CBOR rozszerzył MessagePack, w szczególności o możliwość odróżnienia ciągów tekstowych od ciągów bajtów, co zostało zaimplementowane w 2013 roku w MessagePack.

Specyfikacja kodowania CBOR

Dane zakodowane w CBOR są postrzegane jako strumień elementów danych. Każdy element danych składa się z bajtu nagłówka zawierającego 3-bitowy typ i 5-bitową krótką liczbę. Po tym następuje opcjonalne rozszerzone zliczanie (jeśli krótkie zliczanie mieści się w zakresie 24–27) i opcjonalny ładunek.

Dla typów 0, 1 i 7 nie ma ładunku; liczba jest wartością. W przypadku typów 2 (ciąg bajtów) i 3 (ciąg tekstowy) liczba jest długością ładunku. W przypadku typów 4 (tablica) i 5 (mapa) liczba to liczba elementów (par) w ładunku. W przypadku typu 6 (znacznik) ładunek jest pojedynczym przedmiotem, a liczba jest numerycznym numerem znacznika, który opisuje załączony przedmiot.

dane CBOR Pozycja danych 1 Pozycja danych 2 Pozycja danych 3...
Liczba bajtów 1 bajt (nagłówek elementu danych CBOR) Zmienny Zmienny 1 bajt (nagłówek elementu danych CBOR) Zmienny Zmienny itp...
Struktura Główny typ Krótki rachunek Rozszerzona liczba (opcjonalnie) Ładunek danych (opcjonalnie) Główny typ Krótki rachunek Rozszerzona liczba (opcjonalnie) Ładunek danych (opcjonalnie) itp...
Liczba bitów 3 bity 5 bitów 8 bitów × zmienna 8 bitów × zmienna 3 bity 5 bitów 8 bitów × zmienna 8 bitów × zmienna itp..

Obsługa głównych typów i liczby w każdym elemencie danych

Zachowanie każdego elementu danych jest definiowane przez główny typ i liczbę. Typ główny służy do wybierania głównego zachowania lub typu każdego elementu danych.

5-bitowe pole krótkiej liczby koduje bezpośrednio zliczenia 0–23. Krótkie zliczenia od 24 do 27 wskazują, że wartość zliczeń znajduje się w kolejnym 8, 16, 32 lub 64-bitowym rozszerzonym polu zliczania. Wartości 28–30 nie są przypisane i nie wolno ich używać.

Typy są podzielone na typy „atomowe” 0–1 i 6–7, dla których pole zliczania koduje wartość bezpośrednio, oraz typy nieatomowe 2–5, dla których pole zliczania koduje rozmiar następującego pola ładunku.

Krótka liczba 31 jest używana z typami nieatomowymi 2–5, aby wskazać nieokreśloną długość; ładunek to następujące elementy, aż do „przerwania” bajtu znacznika 255 (typ=7, krótka liczba=31). Krótka liczba 31 nie jest dozwolona w przypadku innych typów atomów 0, 1 lub 6.

Typ 6 (znacznik) jest niezwykły, ponieważ jego pole licznika bezpośrednio koduje wartość, ale ma również pole ładunku (które zawsze składa się z jednego elementu).

Rozszerzone liczniki i wszystkie wartości wielobajtowe są kodowane w kolejności bajtów w sieci (big-endian) .

Kodowanie pól pozycji danych CBOR

Kodowanie małego pola

Liczba bajtów 1 bajt (nagłówek elementu danych CBOR)
Struktura Główny typ Krótka liczba (wartość)
Liczba bitów 3 bity 5 bitów
Atom 0–1, 7 0–23
Znacznik przerwania 7 31

Kodowanie krótkiego pola

Liczba bajtów 1 bajt (nagłówek elementu danych CBOR) Zmienny
Struktura Główny typ Krótki rachunek Wartość
Liczba bitów 3 bity 5 bitów 8 bitów × zmienna
Atom 0–1, 7 24-27 8, 16, 32 lub 64 bity
Strunowy 2–3 0–23 liczyć × 8 bitów
Rzeczy 4–5 0–23 policz × przedmioty/pary
Etykietka 6 0–23 jeden przedmiot

Kodowanie długiego pola

Liczba bajtów 1 bajt (nagłówek elementu danych CBOR) 1, 2, 4 lub 8 bajtów Zmienny
Struktura Główny typ Krótka liczba (24–27) Rozszerzona liczba (długość ładunku) Wartość
Liczba bitów 3 bity 5 bitów 8, 16, 32 lub 64 bity 8 bitów × różne
Strunowy 2–3 24-27 Do 2 64 −1 liczyć × 8 bitów
Rzeczy 4–5 24-27 Do 2 64 −1 policz × przedmioty/pary
Etykietka 6 24-27 Znacznik, do 2 64 −1 jeden przedmiot

Liczby całkowite (typy 0 i 1)

W przypadku liczb całkowitych pole licznika jest wartością; nie ma ładunku. Typ 0 koduje liczby całkowite dodatnie lub bez znaku, o wartościach do 2 64-1 . Typ 1 koduje ujemne liczby całkowite o wartości −1−count, dla wartości od −2 64 do −1.

Struny (typ 2 i 3)

Typy 2 i 3 mają pole licznika, które koduje długość ładunku w bajtach. Typ 2 to nieustrukturyzowany ciąg bajtów. Typ 3 to UTF-8 .

Krótka liczba 31 oznacza łańcuch o nieokreślonej długości. Po nim następują zero lub więcej łańcuchów o określonej długości tego samego typu, zakończonych bajtem znacznika „przerwania”. Wartość pozycji jest konkatenacją wartości dołączonych pozycji. Elementy innego typu lub zagnieżdżone łańcuchy o nieokreślonej długości są niedozwolone. Ciągi tekstowe muszą być indywidualnie dobrze sformułowane; Znaki UTF-8 nie mogą być dzielone na elementy.

Tablice i mapy (typy 4 i 5)

Typ 4 ma pole licznika kodujące liczbę następujących elementów, po których następuje tyle elementów. Nie wszystkie elementy muszą być tego samego typu; niektóre języki programowania nazywają to raczej „krotką” niż „tablicą”.

Alternatywnie, można zastosować kodowanie o nieokreślonej długości z krótką liczbą 31. Trwa to aż do bajtu znacznika „przerwania” równego 255. Ponieważ zagnieżdżone elementy mogą również używać kodowania na czas nieokreślony, parser musi sparować znaczniki przerwania z odpowiednimi bajtami nagłówka o nieokreślonej długości.

Typ 5 jest podobny, ale koduje mapę (zwaną także słownikiem lub tablicą asocjacyjną) par klucz/wartość. W tym przypadku liczba koduje liczbę par przedmiotów. Jeśli używane jest kodowanie o nieokreślonej długości, przed bajtem znacznika „przerwania” musi znajdować się parzysta liczba elementów.

Znacznik semantyczny (typ 6)

Znacznik semantyczny to inny typ atomowy, dla którego wartością jest liczba, ale ma on również ładunek (pojedynczy następujący po nim element), a oba są uważane za jeden element, np. w tablicy lub na mapie.

   Numer znacznika zawiera dodatkowe informacje o typie dla następującego elementu, wykraczające poza to, co może zapewnić 3-bitowy typ główny. Na przykład znacznik 1 wskazuje, że następująca liczba jest czasu w systemie Unix . Znacznik 2 wskazuje, że następujący ciąg bajtów koduje bignum bez znaku . Znacznik 32 wskazuje, że następujący ciąg tekstowy jest identyfikatorem URI zgodnie z definicją w dokumencie RFC 3986 . RFC 8746 definiuje znaczniki 64–87 do kodowania jednorodnych tablic wartości całkowitych lub zmiennoprzecinkowych o stałym rozmiarze jako ciągi bajtów.

Znacznik 55799 ma oznaczać „dane CBOR podążają”. Jest to semantyczna no-op , ale pozwala na dołączenie odpowiednich bajtów znaczników d9 d9 f7 do pliku CBOR bez wpływu na jego znaczenie. Bajty te mogą być użyte jako „ magiczna liczba ” do rozróżnienia początku danych CBOR.

Wartości wszystkich znaczników 0xffff, 0xffffffff i 0xffffffffffffffff są zarezerwowane do wskazania braku znacznika w bibliotece dekodującej CBOR; nigdy nie powinny pojawiać się w strumieniu danych.

Pseudoelement znacznika przerwania nie może być ładunkiem tagu.

Specjalny/pływak (typ 7)

Ten główny typ jest używany do kodowania różnych wartości specjalnych, które nie pasują do innych kategorii. Podlega tym samym zasadom rozmiaru kodowania, co inne typy atomowe (0, 1 i 6), ale pole zliczania jest interpretowane inaczej.

Wartości 20–23 są używane do kodowania wartości specjalnych false, true, null i undefined . Wartości 0–19 nie są obecnie zdefiniowane.

Krótka liczba 24 wskazuje, że następuje 1-bajtowe rozszerzone zliczanie, które może być użyte w przyszłości do zakodowania dodatkowych wartości specjalnych. Aby uprościć dekodowanie, wartości 0–31 mogą nie być kodowane w tej formie. Żadna z wartości 32–255 nie jest obecnie zdefiniowana.

Krótkie zliczenia 25, 26 lub 27 wskazują, że następujące pole rozszerzonego zliczania ma być interpretowane jako (big-endian) 16-, 32- lub 64-bitowa wartość zmiennoprzecinkowa IEEE . Są to te same rozmiary, co rozszerzona liczba, ale są interpretowane inaczej. W szczególności dla wszystkich innych głównych typów 2-bajtowa rozszerzona liczba 0x1234 i 4-bajtowa rozszerzona liczba 0x00001234 są dokładnie równoważne. Nie dotyczy to wartości zmiennoprzecinkowych.

Krótkie liczby 28–30 są zarezerwowane, podobnie jak dla wszystkich innych głównych typów.

Krótka liczba 31 koduje specjalny znacznik „przerwy”, który kończy kodowanie o nieokreślonej długości. Jest to związane, ale różni się od użycia z innymi głównymi typami, w których krótka liczba 31 rozpoczyna kodowanie o nieokreślonej długości. To nie jest przedmiot i może nie pojawiać się w ładunku o określonej długości.

Rejestracja tagów semantycznych

IANA utworzyła rejestr znaczników CBOR, znajdujący się pod adresem https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml . Rejestracja musi zawierać ten szablon.

Typ znacznika semantycznego Zakres Szablon
Pozycja danych Opis semantyczny (forma skrócona) Punktem kontaktowym Opis semantyki (URL)
Działania standardowe 0–23 Wymagany Wymagany
Wymagana specyfikacja 24–255 Wymagany Wymagany
Kto pierwszy ten lepszy 256-18446744073709551615 Wymagany Wymagany Wymagany Opis jest opcjonalny.

Adres URL może wskazywać na Internet-Draft lub stronę internetową.

Implementacje

Nazwa Główny autor Język Licencja Źródło Uwagi
cbor Kyunghwan Kwon C MIT https://github.com/mononn/cbor
QCBOR Laurence'a Lundblade'a C MIT https://github.com/laurencelundblade/QCBOR
cbor-js Patricka Gansterera JavaScript MIT https://github.com/paroga/cbor-js
węzeł-cbor Joego Hildebranda JavaScript MIT https://github.com/hildjj/node-cbor
Kod CBOR Paweł Gulbin PHP PHP https://github.com/2tvenom/CBOREncode
cbor-php Florent Morselli PHP MIT https://github.com/Spomky-Labs/cbor-php
fxamacker/cbor Faye Amacker Iść MIT https://github.com/fxamacker/cbor Testowanie Fuzz, RFC 8949, tagi CBOR, Core Deterministic Encoding, float64/32/16, wykrywanie zduplikowanych kluczy mapy, API is encoding/json + toarray & keyasint struct tags, itp.
cbor Paweł Gulbin Iść WTFPL https://github.com/2tvenom/cbor
cbor_go Briana Olsona Iść APL 2.0 https://github.com/brianolson/cbor_go
go-kodek Ugorji Nbuke Iść MIT https://godoc.org/github.com/ugorji/go/codec Obsługuje również JSON, MsgPack i BinC.
chodź Satoshi Konno Iść APL 2.0 https://github.com/cybergarage/go-cbor
serde_cbor Pyfisz Rdza MIT czy APL 2.0 https://github.com/pyfisch/cbor
cbor-kodek Toralfa Wittnera Rdza MPL 2.0 https://twittner.gitlab.io/cbor-codec/cbor/
SwiftCBOR greg@ nieubłagana.technologia Szybki Cofnij licencję https://github.com/unrelentingtech/SwiftCBOR
CBOR.jl Saurav Sachidanand Julia MIT https://github.com/saurvs/CBOR.jl
Lua-CBOR Kim Alvefur Lua MIT https://www.zash.se/lua-cbor.html
org.conman.cbor Seana Connera Lua GNU LGPL -3 https://github.com/spc476/CBOR
cbor_py Briana Olsona Pyton APL 2.0 https://github.com/brianolson/cbor_py
Flynn Fritza Conrada Grimpena Pyton MIT https://github.com/fritz0705/flynn
cbor2 Alex Gronholm Pyton MIT https://github.com/agronholm/cbor2
CBOR::Bezpłatny Filip Gasper Perl GNU GPL i artystyczne https://metacpan.org/pod/CBOR::Free
CBOR::PP Filip Gasper Perl GNU GPL i artystyczne https://metacpan.org/pod/CBOR::PP
CBOR::XS Marka Lehmanna Perl GNU GPL -3 https://metacpan.org/pod/CBOR::XS
cbor-rubin Sadayuki Furuhashi

Carstena Bormanna

Rubin APL 2.0 https://github.com/cabo/cbor-ruby
libcbor-ruby Paweł Kalwoda Rubin MIT https://github.com/PJK/libcbor-ruby Wiązanie z libcbor.
cbor-erlang Jihyun Yu Erlang BSD -3-klauzula https://github.com/yjh0502/cbor-erlang
eksbor Carstena Bormanna Eliksir nieokreślony,

zapytaj autora

https://github.com/cabo/excbor
orsetto Jamesa Woodyatta OCaml BSD -2-klauzula https://bitbucket.org/jhw/orsetto/ obsługuje również inne formaty ( JSON , Base32 , Base64 , URI , TAI64)
cbor ygrek OCaml MIT https://github.com/ygrek/ocaml-cbor
CBOR R. Kyle'a Murphy'ego Haskella GNU LGPL -3 https://github.com/orclev/CBOR
Bork Joego Hildebranda

Friedela Ziegelmayera

JavaScript MIT https://github.com/dignifiedquire/borc Widelec węzła-cbor.
borc-refs Joego Hildebranda

Friedela Ziegelmayera

Sandro Hawke'a

JavaScript MIT https://github.com/sandhawke/borc-refs Widelec borowy.
CBOR Piotr Okcil C# Oprogramowanie domeny publicznej https://github.com/peteroupc/CBOR Obsługuje również JSON.
Dahomej Cbor Michael Catanzariti C# Licencja MIT https://github.com/dahomey-technologies/Dahomey.Cbor
Jacksona Tatu Saloranta Jawa APL-2.0 https://github.com/FasterXML/jackson-dataformats-binary/tree/master/cbor Obsługuje również inne formaty.
cbor-java Constantin Rack Jawa APL-2.0 https://github.com/c-rack/cbor-java
Jakub JW Janssen Jawa APL-2.0 https://github.com/jawi/jacob
serializacja kotlinx JetBrains Kotlin APL-2.0 https://github.com/Kotlin/kotlinx.serialization Obsługuje wiele platform
cn-cbor Joego Hildebranda

Carstena Bormanna

C MIT https://github.com/cabo/cn-cbor
cbor-cpp Stanisław Owsjannikow C++ APL-2.0 https://github.com/naphaso/cbor-cpp
cppbor Dawid Preece C++ BSD https://github.com/rantydave/cppbor Używa wariantów C++ 17.
libcbor Paweł Kalwoda C MIT https://github.com/PJK/libcbor
małycbor Intel C MIT https://github.com/01org/tinycbor
NanoCBOR Koena Zandberga C Domena publiczna https://github.com/bergzand/NanoCBOR Używany przez RIOT-OS
cbor-d Andriej Penechko D Wzmocnienie 1.0 https://github.com/MrSmith33/cbor-d
clj-cbor Greg Spójrz Clojure Cofnij licencję https://github.com/greglook/clj-cbor
JSON dla nowoczesnego C++ Nielsa Lohmanna C++ MIT https://github.com/nlohmann/json Obsługuje również JSON i MsgPack.
borabora Krzysztofa Engelberta Jawa APL-2.0 https://github.com/noctarius/borabora
Lua-ConciseSerialization Franciszka Perrada Lua MIT https://fperrad.frama.io/lua-ConciseSerialization/
flunn Fritza Conrada Grimpena

Sokołow Jura

Pyton MIT https://pypi.python.org/pypi/flunn
cbor-qt Anton Dutow C++ Domena publiczna https://github.com/anton-dutov/cbor-qt
QCborValue Projekt Qt C++ GNU LGPL https://doc.qt.io/qt-5/qcborvalue.html Część frameworka Qt od wersji 5.12
cbor11 Jakub Varmose Bentzen C++ Domena publiczna https://github.com/jakobvarmose/cbor11
cborcpp Aleks Niekipiełow C++ MIT https://github.com/nekipelov/cborcpp
Złota Rybka Wincentego Lascaux C++ MIT https://github.com/OneNoteDev/GoldFish
Biblioteka-Arduino-Cbor Juanjo Tara C++ APL-2.0 https://github.com/jjtara/Library-Arduino-Cbor
cborg Duncana Couttsa Haskella BSD -3-klauzula https://github.com/well-typed/cborg
cbor Steve'a Hamletta Strzałka MIT https://github.com/shamblett/cbor
wiertacz Mateusz Doenitz Scala MPL 2.0 https://github.com/sirthias/borer Obsługuje również JSON.
nim_cbor Emery'ego Hemingwaya Nim MIT https://git.sr.ht/~ehmry/nim_cbor
tabernakulum Nathaniela McCalluma

Marka Bestavrosa

Zespół Enarx

Rdza Apache 2.0 https://github.com/enarx/ciborium
cbor Paulo Mura Logtalk Apache 2.0 https://github.com/LogtalkDotOrg/logtalk3/tree/master/library/cbor Część dystrybucji Logtalk; może być również używany z Prologu
System.Formaty.Cbor Zespół .NET C# MIT https://github.com/dotnet/runtime/blob/main/src/libraries/System.Formats.Cbor Część .NET 5+
DelphiCBOR mikerabat Delfy Licencja Apache 2.0 https://github.com/mikerabat/DelphiCBOR

Zobacz też

Linki zewnętrzne