微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

大端自定义 varint 的名称?

如何解决大端自定义 varint 的名称?

我正在寻找我使用的大端自定义 varint 的名称。 (我几年前写的,但我怀疑它已经存在。)

测试代码可能比我能更好地解释编码:

#[test]
fn ravint_vec_test() {
    assert_eq!(to_vec(0),[0b00000000]                                     );
    assert_eq!(to_vec(1),[0b00000001]                                     );
    assert_eq!(to_vec(126),[0b01111110]                                     );
    assert_eq!(to_vec(127),[0b01111111]                                     );
    assert_eq!(to_vec(128),[0b10000000,0b00000000]                         );
    assert_eq!(to_vec(129),0b00000001]                         );
    assert_eq!(to_vec(16510),[0b10111111,0b11111110]                         );
    assert_eq!(to_vec(16511),0b11111111]                         );
    assert_eq!(to_vec(16512),[0b11000000,0b00000000,0b00000000]             );
    assert_eq!(to_vec(16513),0b00000001]             );
    assert_eq!(to_vec(2113662),[0b11011111,0b11111111,0b11111110]             );
    assert_eq!(to_vec(2113663),0b11111111]             );
    assert_eq!(to_vec(2113664),[0b11100000,0b00000000] );
    assert_eq!(to_vec(2113665),0b00000001] );
    // ...
    assert_eq!(to_vec(72624976668147838),[0b11111110,0xFF,0xFE] );
    assert_eq!(to_vec(72624976668147839),0xFF] );
    assert_eq!(to_vec(72624976668147840),[0b11111111,0x00,0x00] );
    assert_eq!(to_vec(72624976668147841),0x01] );
    assert_eq!(to_vec(u64::MAX - 1),0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7E] );
    assert_eq!(to_vec(u64::MAX),0x7F] );
}

编码的特点是:

  • 大端
  • 编码保留排序顺序
  • 后面的字节数是第一个字节的前导字节数(无分支解码)
  • 没有重复的编码,例如值 16384-16511,只需要两个字节而不是三个字节(比 Protocol Buffers 的 VarInt 空间效率高 0.7%)

谁能将其识别为预先存在的编码?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。