什么是Varint

硅谷探秘者 算法基础 93 0 0

Varint 是一种紧凑的表示数字的方法。它用一个或多个字节来表示一个数字,值越小的数字使用越少的字节数。这能减少用来表示数字的字节数。

比如对于 int32 类型的数字,一般需要 4 个 byte 来表示。但是采用 Varint,对于很小的 int32 类型的数字,则可以用 1 个 byte 来表示。当然凡事都有好的也有不好的一面,采用 Varint 表示法,大的数字则需要 5 个 byte 来表示。从统计的角度来说,一般不会所有的消息中的数字都是大数,因此大多数情况下,采用 Varint 后,可以用更少的字节数来表示数字信息。下面就详细介绍一下 Varint。

Varint 中的每个 byte 的最高位 bit 有特殊的含义,如果该位为 1,表示后续的 byte 也是该数字的一部分,如果该位为 0,则结束。其他的 7 个 bit 都用来表示数字。因此小于 128 的数字都可以用一个 byte 表示。大于 128 的数字,比如 300,会用两个字节来表示:1010 1100 0000 0010

下图演示了 Google Protocol Buffer 如何解析两个 bytes。注意到最终计算前将两个 byte 的位置相互交换过一次,这是因为 Google Protocol Buffer 字节序采用 little-endian 的方式。

猜你喜欢
算法基础 137 一、protobuf?在移动互联网时代,手机流量、电量最为有限的资源,而移动端的即时通讯应用无疑必须得直面这两点。解决流量过大的基本方法就使用高度压缩的通信协议,而数据压缩后流量减小带来的
数据结构与算法 1842 对于栈,一般来讲先进后出。而所谓单调栈则在栈的先进后出基础之上额外添加一个特性:从栈顶到栈底的元素严格递增(or递减)。那具体的进栈过程如下:1.对于单调递增栈,若当前进栈元素为e,从栈顶开
java基础 505 1.先看一下线程的生命周期转换图(学java的此图必背)本篇文章的主要目的不分析线程的各种状态之间的转换,而主要研究一下线程之间的通讯机制,以及Object的wait方法和notify方法。所以
weblog 3546 从计算机程序出现的第一天起,对效率的追求就程序天生的信仰,这个过程犹如一场没有终点,永不停歇的F1方程式竞赛,程序员车手,技术平台则在赛道上飞驰的赛车。---深入理解java虚拟机现在
official 38 根据前几篇的文章对bio、nio网络模型的叙述,我们可能大概已经了解了io网络模型的演化过程,以及在演化过程中的各个阶段各自解决了那些问题,以及如何提高性能的。随着select、poll
java基础 3079 静态方法不能new内部类的实例对象解析:我们知道非静态内部类有一个特点就可以访问外部类对象的非静态属性,而外部类的的属性只有再创建对象以后才有,而静态方法属于类,不属于对象,所以再main方法执行
blog KMP算法
数据结构与算法 6323 1.PMTKMP算法的核心,一个被称为部分匹配表(PartialMatchTable)的数组。我觉得理解KMP的最大障碍就很多人在看了很多关于KMP的文章之后,仍然搞不懂PMT中的值代表了
linux系统 1839 ),不过应该没影响。3)使用vim编辑此文件4)使用servicenetworkstart重启服务即可。
归档
2018年11月  12 2018年12月  33 2019年01月  28 2019年02月  28 2019年03月  32 2019年04月  27 2019年05月  33 2019年06月  6 2019年07月  12 2019年08月  12 2019年09月  21 2019年10月  8 2019年11月  15 2019年12月  25 2020年01月  9 2020年02月  5 2020年03月  16 2020年04月  4 2020年06月  1 2020年07月  7 2020年08月  13 2020年09月  9 2020年10月  5 2020年12月  3 2021年01月  1 2021年02月  5 2021年03月  7
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo
目录