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 值

值即为字节数组。


来源:
https://github.com/sinfere/bkv/blob/master/README-cn.md