本期记录一下Zipack的类型树和前缀表。从类型树上看,Zipack一共有21种数据类型,包括15种已分配类型和6种保留类型,15种已分配类型中又有11种基本类型和4种复合类型,11种基本类型中有5个是实数类型。大家可以按这种分类方法把所有类型一一对应上去,理解一遍。
基于Huffman编码的类型树
Zipack
├─── 0:小自然数
╰─── 1
├─── 10
│ ├─── 100:小字符串
│ ╰─── 101:小列表
╰─── 11
├─── 110:小字典
╰─── 111
├─── 1110:(小)保留
╰─── 1111
├─── 1111,0
│ ├─── 1111,00
│ │ ├─── 1111,000
│ │ │ ├─── 1111,0000:True
│ │ │ ╰─── 1111,0001:False
│ │ ╰─── 1111,001
│ │ ├─── 1111,0010:正小数
│ │ ╰─── 1111,0011:负小数
│ ╰─── 1111,01
│ ├─── 1111,010
│ │ ├─── 1111,0100:VLQ字节流
│ │ ╰─── 1111,0101:VLQ字符串
│ ╰─── 1111,011
│ ├─── 1111,0110:VLQ列表
│ ╰─── 1111,0111:VLQ字典
╰─── 1111,1
├─── 1111,10
│ ├─── 1111,100
│ │ ├─── 1111,1000:VLQ正整数
│ │ ╰─── 1111,1001:VLQ负整数
│ ╰─── 1111,101
│ ├─── 1111,1010:Null
│ ╰─── 1111,1011:保留
╰─── 1111,11
├─── 1111,110
│ ├─── 1111,1100:保留
│ ╰─── 1111,1101:保留
╰─── 1111,111
├─── 1111,1110:保留
╰─── 1111,1111:保留
图中的树形结构使用了制表符
前缀表明细
类型前缀 | 长度段 | 长度含义 | 负载 | |
---|---|---|---|---|
迷你自然数 | 0 | 无 | \ | 7bit |
VLQ正整数 | 1111 1000 | 无 | \ | vlq自然数+128 |
VLQ负整数 | 1111 1001 | 无 | \ | -1-vlq自然数 |
正小数 | 1111 0010 | 无 | \ | (精度反转算法) |
负小数 | 1111 0011 | 无 | \ | (精度反转算法) |
短字符串 | 100 | 5bit | 字符的数量 | zipack字符串 |
VLQ字符串 | 1111 0101 | vlq自然数+32 | 字符的数量 | zipack字符串 |
字典中的“键” | 无 | vlq自然数 | 字符的数量 | zipack字符串 |
纯字节流 | 1111 0100 | VLQ自然数 | 字节数量 | 字节流 |
Boolean | 1111 0000、1111,0001 | 无 | \ | 无 |
null/nil | 1111 1010 | 无 | \ | 无 |
短列表 | 101 | 5bit | 列表元素的数量 | 子元素无缝拼接 |
VLQ列表 | 1111 0110 | VLQ自然数+32 | 列表元素的数量 | 子元素无缝拼接 |
迷你字典 | 110 | 5bit | 键值对的数量 | 键值无缝拼接 |
字典 | 1111 0111 | vlq自然数+32 | 键值对的数量 | 键值无缝拼接 |
保留类型 | FB、FC、FD、FE、FF | \ | \ | \ |
保留类型(带长度) | 1110 0000 ~ 1110 1111 | 4bit | 某种保留对象的数量 | \ |