RrunningW```
b20f0fa8创建于 2025年12月12日历史提交
 0 1 2 3 4 5 6 7 bit
|-|-|-|-|-|-|-|-|
|-  i  -|s|- l -|
|-  f  -|s|- l -|
|-  s  -| - l - |
|-  b  -| - v - |
|- bi  -|s|- l -|
|-  r  -|s|- l -|
|-  d  -|s|- l -|
|-  t  -|s|- l -|
|-  l  -|-  ll -|
|-  m  -|-  ml -|
|-  o  -|-  ol -|
n: 只有一字节,0
 n:|00000000|
i: s是符号位,1表示负数,0表示非负数。l取值是1到8,由于只有三位,l是8时溢出为0。取值范围是[Int64.Min, UInt64.Max],负数会先取位反再输出,正数小端序输出,值如果是0后四位是0001,后面紧跟一个值是0的字节。
  0:|00110001|
    |00000000|
 -1:|00111001|
    |00000000|
  1:|00110001|
    |00000001|
f: l全0表示NaN,全1表示Inf,0001表示0.0,1001表示-0.0,没有后续字节。其它取值只有2 4 8,8会溢出为0。负数取相反数,正数取f.toBits()再按照无符号整数输出。
   NaN:|01000000|
   Inf:|01001111|
   0.0:|01000001|
1.0f16:|01000010|
       |twobytes|
       |of float|
s: l表示字符串长度的字节数,后面紧跟着表示长度的小端序字节序列,后面是UTF8字节。空串只有一字节00010000,后续没有字节。
hi:|00010001|
   |00000010|
   |h       |
   |i       |
b: v取值只有0或1,分别表示false/true。只有一字节00100000和00100001,没有后续字节。
 true:|00100001|
false:|00100000|
bi1: 如果bi在i的取值区间,则按照i输出。编号也是i。
bi2: 超过i取值区间的,l是bi.toBytes()的长度的字节数(如果是正数就是bi.toBytes()[1 .. ].size),紧跟着长度字节序列,然后是bi.toBytes()(如果是正数就是bi.toBytes()[1 ..])。
|- bi2 -|s|- l -|
|bytes of bytes |
| length        |
|bi.toBytes()   |
r1|r2: 为避免损失精度,不转成基本类型。获得r.value,严格按照bi输出。后面跟着精度和标度。详细格式如下:
|-  r  -|s|- l -|
| bytes of value|
|- sc  -|-bytes-|
|- of scale    -|
sc是标度字节数,占四比特,sc表示本字节后面还有几字节是标度字节。
bytes of scale是标度值的字节序列,scale<=15的,sc是0,bytes of scale独占一字节;scale>15的,sc后面的四比特是scale最低位四比特,然后按小端序编码scale。
r.value在i取值区间的, l和bytes of value采用bi1,编号是r1;超过这个区间的采用bi2,编号是r2。
对于r值是0,scale>0的,s+l是0000,没有bytes of value,scale照前述输出。
对于scale是0的,按照bi1|bi2输出,编号是bi1|bi2。
d1|d2: BigInt(d.toSeconds()) * BigInt(10**9) + BigInt((d - Duration.second * d.toSeconds()).toNanoseconds()),再严格按照bi1|bi2输出。
t1|t2: t - DateTime.Epoch再按照d1|d2的格式输出。
l: ll是集合元素的字节数,紧跟着长度的字节序列,然后按照各种数据格式输出
长度是0的:|11010000|,没有后续字节
m: ml是map元素数的字节数,紧跟着长度的字节序列,然后按照遍历顺序和各种数据格式输出
长度是0的:|11100000|,没有后续字节
o: ol是是类型全限定名的murmur_hash的长度,后面是murmur_hash,然后是object fields数量的字节数和数量,紧跟着fields数的字节序列,然后按照DataObject<T>(object).fields()的名称。
没有fields的:|11110000|,没有后续字节
类型(t) 编号|二进制
None(n) 0|0000
字符串(s) 1|0001
Bool(b) 2|0010
整数(i) 3|0011
浮点数(f) 4|0100
BigInt(bi1) 5|0101(保留编号)
BigInt(bi2) 6|0110
Decimal(r1) 7|0111
Decimal(r2) 8|1000
Duration(d1) 9|1001
Duration(d2) 10|1010
DateTime(t1) 11|1011
DateTime(t2) 12|1100
list|array|set(l) 13|1101
map(m) 14|1110
object(o) 15|1111