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 |
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 |