#unsigned-integer #64-bit #byte #variables #length #numbers

no-std varu64

无符号64位整数的可变长度编码

12个版本 (6个破坏性)

0.7.0 2021年10月19日
0.6.2 2020年11月4日
0.6.1 2018年10月31日
0.5.0 2018年10月16日
0.1.0 2018年3月13日

#953编码

Download history 38/week @ 2024-03-25 90/week @ 2024-04-01 40/week @ 2024-04-08 74/week @ 2024-04-15 71/week @ 2024-04-22 31/week @ 2024-04-29 32/week @ 2024-05-06 36/week @ 2024-05-13 86/week @ 2024-05-20 56/week @ 2024-05-27 79/week @ 2024-06-03 62/week @ 2024-06-10 62/week @ 2024-06-17 83/week @ 2024-06-24 23/week @ 2024-07-08

每月182次下载
7 个crate(5个直接)中使用

AGPL-3.0

34KB
693

VarU64

一个简单的无符号64位整数的可变长度编码。

规范

要解码varu64,查看第一个字节。如果其值小于248,则该值本身是编码的数字。否则,第一个字节确定编码的进一步 length

第一个字节 附加字节数
248 1
249 2
250 3
251 4
252 5
253 6
254 7
255 8

在第一个字节之后是 length 个字节。这些字节是编码数字的大端表示。

在所有可能表示该方案接受的数字中,最短的一个是它的唯一有效编码。如果某个值使用了比必要的编码更长的编码,则解码器必须指示错误。

注释/属性

可以通过测试是否将第一个5位设置为1来有效地检查第一个字节是否表示长度。在这种情况下,长度本身是1加上最后三位的值。换句话说,additional_bytes = (first_byte & 0xf8 == 0xf8) ? (first_byte & 7) + 1 : 0.

可以通过仅查看第一个字节来确定编码值的长度。

规范编码意味着如果有两个或更多附加字节,则可能没有前导零字节。如果只有一个附加字节,则附加字节必须大于或等于248。这意味着0-247以一个字节编码,但248-255以两个字节编码。

由于仅允许最短可能的编码的规范性要求,因此无符号64位整数和编码之间存在一一对应关系。

该格式的简洁性和规范性带来的代价是大量的未使用字节字符串(数量相对较多)。另一方面,这些字符串可以用作扩展点。

相关工作:本工作受到了multiformats varint存储库中问题的启发,特别是问题#8#12

许可证

规范(此文件)采用CC BY-SA 4.0许可,该存储库中的代码采用AGPL-3.0许可。

依赖

~1.5MB
~37K SLoC