簡明二進制對象展現(CBOR,Concise Binary Object Representation)是一種提供良好壓縮性,擴展性強,不需要進行版本協商的二進制數據交換形式。這些特性使它有別於早期的ASN.1和MessagePack等二進制序列化方式。RFC 7049定義了詳細的CBOR格式與說明。
基本介紹
- 中文名:簡明二進制對象表示
- 外文名:Concise Binary Object Representation(CBOR)
CBOR編碼格式,CBOR的數據頭,
CBOR編碼格式
CBOR每個DataItem(數據項)的初始一個位元組包含兩個信息,高3位的Major Type(主要類型),低5位的Additional Information(附加信息)。
CBOR數據 | 數據項 | |||
位元組(byte)數 | 1位元組(CBOR Data Item Header) | 動態長度 | 動態長度 | |
結構 | Major Type | Additional Information | Payload Length (可選) | Data Payload (可選) |
位(bit)數 | 3 Bits | 5Bits | 動態長度 | 動態長度 |
CBOR的數據頭
主要類型 | 主要類型值 | 附加信息值(無符號) | 附加信息說明 | 是否存在載荷長度域 | 是否存在數據載荷域 | |
Unsigned Integer | 0 | 0b000 | 5位附加信息可以是整數本身(附加信息值為0(含)到23(含))或數據的長度。 | |||
0(含)到23(含) | 附加信息直接用作數據載荷 | 否 | 否 | |||
24 | 接下來的1個位元組uint8_t作為數據載荷 | 否 | 是 | |||
25 | 接下來的2個位元組uint16_t作為數據載荷 | 否 | 是 | |||
26 | 接下來的4個位元組uint32_t作為數據載荷 | 否 | 是 | |||
27 | 接下來的8個位元組uint64_t作為數據載荷 | 否 | 是 | |||
Negative Integer | 1 | 0b001 | 數據載荷的值為-1減去待編碼的負整數 | |||
0(含)到23(含) | 附加信息直接用作數據載荷 | 否 | 否 | |||
24 | 接下來的1個位元組uint8_t作為數據載荷 | 否 | 是 | |||
25 | 接下來的2個位元組uint16_t作為數據載荷 | 否 | 是 | |||
26 | 接下來的4個位元組uint32_t作為數據載荷 | 否 | 是 | |||
27 | 接下來的8個位元組uint64_t作為數據載荷 | 否 | 是 | |||
Byte String | 2 | 0b010 | 使用附加信息作為位元組字元串的長度或聲明載荷長度域的長度 | |||
0(含)到23(含) | 直接用來聲明載荷長度域 | 否 | 是 | |||
24 | 接下來的1個位元組uint8_t作為載荷長度域 | 是 | 是 | |||
25 | 接下來的2個位元組uint16_t作為載荷長度域 | 是 | 是 | |||
26 | 接下來的4個位元組uint32_t作為載荷長度域 | 是 | 是 | |||
27 | 接下來的8個位元組uint64_t作為載荷長度域 | 是 | 是 | |||
Text String | 3 | 0b011 | 使用附加信息作為文本字元串的長度或聲明載荷長度域的長度 | |||
0(含)到23(含) | 直接用來聲明載荷長度域 | 否 | 是 | |||
24 | 接下來的1個位元組uint8_t作為載荷長度域 | 是 | 是 | |||
25 | 接下來的2個位元組uint16_t作為載荷長度域 | 是 | 是 | |||
26 | 接下來的4個位元組uint32_t作為載荷長度域 | 是 | 是 | |||
27 | 接下來的8個位元組uint64_t作為載荷長度域 | 是 | 是 | |||
Array | 4 | 0b100 | Arrays(數組)也可以叫作Lists(列表), Sequences(序列), 或Tuples(元組). 長度域代表數組元素的個數。 | |||
0(含)到23(含) | 直接用來聲明載荷長度域 | 否 | 否 | |||
24 | 接下來的1個位元組uint8_t作為載荷長度域 | 是 | 否 | |||
25 | 接下來的2個位元組uint16_t作為載荷長度域 | 是 | 否 | |||
26 | 接下來的4個位元組uint32_t作為載荷長度域 | 是 | 否 | |||
27 | 接下來的8個位元組uint64_t作為載荷長度域 | 是 | 否 | |||
... | 保留 | |||||
31 | 長度不確定的數組,編碼結束要加上Break Code(0xFF) | 否 | 否 | |||
Map | 5 | 0b101 | 鍵值對映射的數據項集合。Map(鍵值對)也被叫作Tables(表格), Dictionaries(字典), Hashes(哈希集)或Object(JSON中的對象)。Map中的長度域指數據項的對數。每個Map實體包含兩個按順序排列的數據項,一個數據項作為鍵,一個數據項作為值。 | |||
0(含)到23(含) | 直接用來聲明載荷長度域 | 否 | 否 | |||
24 | 接下來的1個位元組uint8_t作為載荷長度域 | 是 | 否 | |||
25 | 接下來的2個位元組uint16_t作為載荷長度域 | 是 | 否 | |||
26 | 接下來的4個位元組uint32_t作為載荷長度域 | 是 | 否 | |||
27 | 接下來的8個位元組uint64_t作為載荷長度域 | 是 | 否 | |||
... | 保留 | |||||
31 | 長度不確定的Map,編碼結束要加上Break Code(0xFF) | 否 | 否 | |||
Tag | 6 | 0b110 | 用來作為其他Major Types(主要類型)可選語義標籤 | |||
0(含)到23(含) | - | 否 | 否 | |||
24(含)到255(含) | - | 否 | 否 | |||
256(含)到18446744073709551615(含) | - | 否 | 否 | |||
Special | 7 | 0b111 | 浮點數據和沒有內容,沒有結束碼的簡單數據類型 | |||
0(含)到23(含) | 簡單值(在附加信息中聲明值) | 否 | 否 | |||
24 | 簡單值(使用接下來的一個位元組表示32(含)到255(含)的值) | 否 | 是 | |||
25 | 半精度浮點型(16位) | 否 | 是 | |||
26 | 單精度浮點型(32位) | 否 | 是 | |||
27 | 雙精度浮點型(64位) | 否 | 是 | |||
28 | 保留 | |||||
29 | ||||||
30 | ||||||
31 | 長度不確定的數據項,編碼結束要加上Break Code(0xFF) | 否 | 否 |