美文网首页
整数的Varint编码

整数的Varint编码

作者: ShootHzj | 来源:发表于2021-07-12 23:55 被阅读0次

    Varint编码

    一个简单的消息

    假设你有如下的protobuf定义

    syntax = "proto3";
    package test;
    option go_package = "test";
    
    message Test1 {
      optional int32 a = 1;
    }
    

    在应用中,你创建了一个TestMessage实例,将a设置为150。接下来将消息序列化。检查序列化后的消息,你会发现是这么一个字节数组

    0x08 0x96 0x01
    

    Base 128 Varints

    这是一个varints编码。varints是一种使用1个或多个字节来序列化整数的方式。更小地数字占更少的字节。

    varint 中的每个字节,除了最后一个字节,都设置了最高有效位 (msb)——这表明还有更多的字节需要处理。 每个字节的低 7 位用于以 7 位为一组存储数字的二进制补码表示,采用小端字节存储。

    举个例子,对于1来说,由于只有1个字节,所以没有设置msb

    0000 0001
    

    这是300,有一些复杂

    1010 1100 0000 0010
    

    怎么发现这是300的?首先,先把每个字节的msb去掉,变换为

    010 1100 000 0010
    

    再进行小端转换,变为

    000 0010 010 1100
    

    组合为

    100101100
    

    即就是300

    相关文章

      网友评论

          本文标题:整数的Varint编码

          本文链接:https://www.haomeiwen.com/subject/azcjpltx.html