本文转自【 https://www.jianshu.com/p/76adec5e61f8 】,有删改。
CONTENTS
前言
CBOR是专门为受限制物联网终端设计的数据交换格式,该格式轻量间接,可以简单理解为二进制形式JSON格式。
CBOR简述
CBOR可分为8个主类型(Major Type),CBOR格式为了定义8种不同的类型,采用首字节的高3位定义主类型,首字节的低5位在不同的主类型表示长度(除主类型0和主类型1),如果长度指示不足,则依次使用后续字节。
主类型 | 名称 | 首字节 | 简单说明 |
主类型0 | 无符号整数 | 0x00或 0x10 | 基础类型 |
主类型1 | 负整数 | 0x20或 0x30 | 基础类型 |
主类型2 | 字节数组 | 0x40或 0x50 | 基础类型 |
主类型3 | 字符串 | 0x60或 0x70 | 基础类型 |
主类型4 | 数组 | 0x80或 0x90 | 复合类型,可嵌套任意类型 |
主类型5 | 键值对 | 0xA0或 0xB0 | 复合类型,可嵌套任意类型 |
主类型6 | 扩展 | 0xC0或 0xD0 | 扩展类型 |
主类型7 | 复合 | 0xE0或 0xF0 |
无符号整数 an unsigned integer
主类型0,无符号整数编码后首字节为0b000_XXXXX。为了表达不同长度的无符号整数,CBOR格式使用第一个字节的低5位表示整数类型。
0b000_11000 uint8_t
0b000_11001 uint16_t
0b000_11010 uint32_t
0b000_11011 uint64_t
请注意,无符号整数0到23直接表达,无需使用整数类型。
例如:
10 编码后 0x0A
24 编码后 0x1818
100 编码后 0x1864
1000 编码后 0x1903E8
负整数 a negative integer
主类型1,无符号整数编码后首字节为0b001_XXXXX。负整数的编码方式与无符号整数相似。
例如:
-10 编码后 0x29
-24 编码后 0x37
-100 编码后 0x3863
-1000 编码后 0x3903E7
字节数组 a byte string
主类型2,字节数组编码后首字节为0b010_XXXXX。为了表达字节数组长度,如果字符数组的长度小于等于23,那么直接使用首字节的低5位表示;如果长度大于或等于24字节,那么使用第二个字节表示长度;如果长度大于等于256字节,那么使用第二和第三个字节表示长度。
CBOR格式中一般采用多字节组合的方式表达长度。CBOR这样的长度描述方法便于嵌入式设备使用C语言解析CBOR格式,节约宝贵的栈空间与堆空间。
例如:
HEX格式01020304 编码后 0x4401020304
长度为23的字节数组 编码后 0x57XX….
长度为24的字节数组 编码后 0x5818XX…
长度为500的字节数组 编码后 0x5901F4XX…
本质来说,CBOR仅为这些原始的字节数组增加了一个长度描述。
字符串 a text string
主类型3。字符串类型编码后首字节为0b011_XXXXX。字符串格式与字节数组格式非常相似,只是字节数组格式人类不可读,而字符格式人类可读。字符串格式表达长度的方式与字节数组类型相似。
例如:
“a” 编码后 0x6161
“IETF” 编码后 0x6449455446
长度为24的字符串编码后 0x781830XX…
数组 an array of data items
主类型4。 数组编码后首字节为0b100_XXXXX。数组为一种复合类型,可以与自身或其他类型嵌套。数组中数组元素个数(不是编码后字节长度)的表达方式与字节数组类型相似。
例如:
[1,2,3] 编码后 0x83010203
[1,[2,3], [4,5]] 编码后 0x8301820203820405,此处包括3个数组,第一个数组0x83,表示元素个数为3,第二个0x82b表示元素个数为2,第3个编码后元素个数为3。
[500, 501, 502] 编码后为0x831901F41901F51901F6,不是0x8301F401F501F6
键值对 a map of pairs of data items
在JSON类型中,键名Key必须为字符串,但是在CBOR格式中,键名Key可以是整数。CBOR通过这种方式可以节省物联网终端开销。
主类型5。键值对编码后首字节为0b101_XXXXX。键值对也是一种复合类型,可以嵌套任意类型。键值对类型中键值对个数(不是编码后的字节长度)的表达方式与字节类型表达方式相似。
扩展类型
主类型6。扩展类型编码后首字节为0b110_XXXXX。
浮点数与简单类型
主类型7。浮点数与简单类型编码后首字节为0b111_XXXXX。该类型定义了简单类型,时间类型(Date和Time)、大整数(Bignum),10进制整数(Decimal)等。在主类型7中,首字节的高3位固定为0b111,首字节中低5位用于表示子类型。
参考资料
【 RFC7049 Concise Binary Object Representation (CBOR) 】
发表评论