美文网首页
protobuf可变长度原理

protobuf可变长度原理

作者: 老苗 | 来源:发表于2018-12-03 11:12 被阅读12次

这篇文章在你已经了解protobuf使用的基础上,更进一步的学习,如果不知道protobuf是什么?请查阅这篇文章【golang-protobuf使用】

可变长度类型

官网说明地址:https://developers.google.com/protocol-buffers/docs/proto3

proto文件的可变长度类型有:int32、int64、uin32、uin64、sint32、sint64

连续位标识

Protobuf用的是连续位标识技术,使用每个字节的第一位来标识是否需要继续向后读。每个字节低7位用于实际的编码。

举例:

本次举例使用uin32类型

十进制:300
二进制(4个字节):00000000 00000000 00000001 1000000

protobuf编码过程

  • 从二进制低字节(右边),开始7位分割 : 1100000 000000

  • 倒序: 0000000 1100000

  • 增加标识符位:10000000 01100000
    1表示继续往后读取,0表示停止读取

所以最终编码结果为 10000000 01100000,这样将4字节存储大小转化为2字节存储大小

测试

目标:将10^32bit的二进制进行编码

proto文件格式

syntax = "proto3";
message Block {
    repeated  uint32 data = 1;
}

测试结果:


总结

由测试结果可得如果高位(左边)字节为0,编码结果大小相应减少

相关文章

  • protobuf可变长度原理

    这篇文章在你已经了解protobuf使用的基础上,更进一步的学习,如果不知道protobuf是什么?请查阅这篇文章...

  • ArrayList集合

    集合概述 集合,长度可变的容器 1 ArrayList集合可变长度原理: ArrayList集合:底层原理也是,数...

  • Java语法糖之可变长度参数

    可变长度参数原理 反编译class文件: 可变长度参数只能作为方法中的最后一个参数,而且只能有一个。 总结 Jav...

  • JavaSE进阶十一 反射机制二

    1,可变长度参数 语法:类型... (注意:一定是3个点) 可变长度参数要求参数个数是:0-N个。 可变长度参数在...

  • 深入 ProtoBuf - 反射原理解析

    在介绍了 ProtoBuf 序列化原理之后,本文介绍 ProtoBuf 的反射技术原理。 反射技术简介 对于反射大...

  • scala数据结构与可变不可变

    数组:可变与不可变不可变数组是指数组的长度是不可变的,但是数组对应的元素是可变的可变数组的长度和元素都可以改变 不...

  • 1.7.Swift 3-String和NSString处理Uni

    unicode长度是可变的。除了code unit的长度可变之外,unicode另外一个可变的特性,即组成同一个字...

  • protobuf原理

    protobuf原理 压缩算法。字典法 有一些标识一些字符,例如用2标识为a。3标识为b等 解码,将标识符解码成二...

  • char 和varchar

    char的长度是不可变的,而varchar的长度是可变的 1、定义一个char[10]和varchar[10],如...

  • 06. Go极简教程 slice的基础使用

    数组的长度不可改变,切片长度是可变的, 相当于可变数组 参考资料:http://go-tour-zh.appspo...

网友评论

      本文标题:protobuf可变长度原理

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