BKV是一种带长度二进制的键值对协议。
BKV = binary key value
1 协议格式
bkv = kv对 + kv对 + kv对 + …
kv对 = length + key length + key + value
即:
kv对 = 当前kv对总字节数+键的字节数+键+值
length = len(key length + key + value)
key length = len(key)
规则:
- BKV由多个KV拼接而成;
- 每个KV由四部分组成:总长度(length)、Key长度(key length)、Key值、Value值;
- 总长度和Key长度确定了Key和Value的边界;
- Key有两种类型,string和number;
- Value为字节数组;
1.1 Length 一个kv对的总长度
length = length(key + value), vary bytes
长度字节用每个字节的bit0作为停止位,如果为1则表示下一个字节仍然表示长度,如果为0,则表示终止;例如,如果长度小于128,那么用一个字节就可以表示完整,如果长度大于128,那么用多个字节表示,多个字节中除了最后一个字节的bit0为0,其它字节的bit0均为1。
Softool’s Notes:
长度数值存放规则:
- bit7表示后续字节是否为长度值,1表示后续字节依然是长度值,0表示当前字节是长度值的最后1个字节
- bit[6,1]表示值,其值<=2^7=128;
- 如果长度值>128时,大端模式排序;
举例:
十进制的2 -> 0x02
十进制的666 -> 0x851A
十进制的88888888 -> 0xAAB1AC38
1.2 Key Length 键长度
规则:
- 键长使用1字节;
- bit7表示键类型,1表示string,0表示number。
- bit[6,1]表示键的长度,其值<=2^7=128
1.3 Key 键
键根据键类型来解析。
注意,如果是number型,BKV会对number进行压缩,例如3(uint64_t)会被压缩成一个字节的0x03
1.4 Value 值
值即为字节数组。