• protobuf 编码


    ProtoBuf编码基础——Varints, varints是一种将一个整数序列化为一个或者多个Bytes的方法,越小的整数,使用的Bytes越少。

    Varints的基本规则是:

    a) 每个Byte的最高位(msb)是标志位,如果该位为1,表示该Byte后面还有其它Byte,如果该位为0,表示该Byte是最后一个Byte

    b)每个Byte的低7位是用来存数值的位

    cVarints方法用Litte-Endian(小端)字节序

    举个例子:300Varints序列化的结果是1010 1100 0000 0010,运算过程如下 所示:

    1010 1100 0000 0010->010 1100 000 0010(去标志位)->

    000 0010 010 1100(调整字节序)-> 1 0010 1100 ->256+32+8+4=300(计算值)


    ProtoBuf中消息的编码规则:

    a)每条消息(message)都是有一系列的key-value对组成的, keyvalue分别采用不同的编码方式。

    b)对某一条件消息(message)进行编码的时候,是把该消息中所有的key-value对序列化成二进制字节流;而解码的时候,解码程序读入二进制的字节流,解析出每一个key-value对,如果解码过程中遇到识别不出来的类型,直接跳过。这样的机制,保证了即使该消息添加了新的字段,也不会影响旧的编/解码程序正常工作。

    ckey由两部分组成,一部分是在定义消息时对字段的编号(field_num),另一部分是字段类型(wire_type)。字段类型定义如下表所示。

    Type

    Meaning

    Used For

    0

    Varint

    int32, int64, uint32, uint64, sint32, sint64, bool, enum

    1

    64-bit

    fixed64, sfixed64, double

    2

    Length-delimited

    string, bytes, embedded messages, packed repeated fields

    3

    Start group

    groups (deprecated)

    4

    End group

    groups (deprecated)

    5

    32-bit

    fixed32, sfixed32, float

    dkey的编码方式:field_num << 3 | wire_type

    evarint类型(wire_type=0)的编码,与第(1)部分中介绍的方法基本一致,但是int32, int64sint32,sint64有些特别之处int32int64就是简单的按varints方法来编码,所以像-1-2这样负数也会占比较多的Bytes于是sint32sint64采用了一种改进的方法:先采用Zigzag方法将所有的整数(正数、0和负数)一一映射到所有的无符号数上,然后再采用varints编码方法进行编码Zigzag映射函数为:

    Zigzag(n) = (n << 1) ^ (n >> 31),  nsint32

    Zigzag(n) = (n << 1) ^ (n >> 63),  nsint64

    这样映射后再进行编码的好处就是绝对值比较小的负数序列化后的结果占的Bytes数也会比较少。

    f64-bit(wire_type=1)32-bit(wire_type=5)的编码方式就比较简单了,直接在key后面跟上64bits32bits,采用Little-Endian(小端)字节序。

    glength-delimited(wire_type=2)的编码方式:key+length+content, key的编码方式是统一的,length采用varints编码方式,content就是由length指定的长度的Bytes

    hwire_type=34的现在已经不推荐使用了,因此这里也不再做介绍。


  • 相关阅读:
    flutter canvas 简单绘画直线
    Yapi 部署及遇到的坑
    flutter 时间选择器第三方插件返回时间格式说明
    windows + flutter + vscode 连接其他模拟器
    flutter 配置环境
    flutter 返回键监听
    flutter 自定义主题切换
    flutter Provide 状态管理篇
    flutter 本地存储 (shared_preferences)
    JS做倒计时的例题
  • 原文地址:https://www.cnblogs.com/vigarbuaa/p/2890534.html
Copyright © 2020-2023  润新知