好记性不如铅笔头

编程

【转】物联网专用数据交换格式CBOR

本文转自【 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)

发表评论

4 × 4 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据