Base 128 Varint可以说是一种编码方式,也可以说是一种压缩算法。这种压缩算法是用来压缩数字的传输的,压缩的依据是基于一个现实:越小的数字,越经常使用

我们来看看一个例子:

如果我们要网络传输数字1,会怎样传输呢?

假设我们用的是32位的整形传输,那么经过编码,这个1的传输形式是:

00000000 00000000 00000000 00000001

然而,在这一堆要传输的数据里,几乎所有的0都是无效数据(除了最后一个字节里,那些0没办法的无效填充),但是由于编码的限制,又不得不把这堆0加上去。Base 128 Varints 编码要解决的就是这个事情。那么,Base 128 Varint是如何编码的呢?

(1)除了最后一个字节,varint中的每个字节的最高位设为1,表示后面还有字节出现

(2)每个字节的低7位看成是一个组(group),这个组和他相邻的下一个7位组共同存储某个整形的“组合表示”,最低有效组在前面。

很抽象,还是举例子说明一下

(1)1个字节,假设数字是 0000 0001

则经过Base 128 Varint编码后,还是原来的样子 (0000 0001)

(2)2个字节,这次我们来个解码,假设经过Base 128 Varint编码后的01串是 1010 1100 0000 0010

根据定义,第1个字节的最高位是1,说明后面还是有数据。我们往后看,第2个字节的最高位是0,好,说明这个数编码后是使用2字节的了。

取第1个字节的低7位,为:0101100

取第2个字节的低7位,为:0000010

我们再来看这句:最低有效组在前面

然后倒过来组合起来,即为原01串:

0000010 0101100(即十进制的300)

PS:这里的倒装方式涉及到编码方式的大小端

(3)3个字节,我们来看看怎么对 0110 1011 0110 0011进行编码

a.从低位到高位,取7位为一个组(不足7位前面补0),这里为

1100011

1010110

0000001

b.反转组装 1100011 1010110 0000001

c.除了在最后一个字节补0,其他字节补1,即为:11100011 11010110 00000001

(4)更多字节

聪明的你应该已经发现了,用Base 128 Varint编码的最大表示数为2^28,非常正确,同时说明了,天下没有免费的午餐,有得必有失。但是,大家还记得前面说的那句话吗:压缩的依据是基于一个现实:越小的数字,越经常使用 , 所以,这个压缩算法,是满足绝大部分情况的。当然,如果传输的数字都是比较大的特殊情况,就不推荐这种算法了

PS:如何确认一个数字经过Base 128 Varint要用多少字节的传输或存储:

1个字节的Base 128 Varint编码后,有7位可以存储,即可以传输数字为 0-2的7次方

以此类推:2个字节是2的14次方,3个字节为2的21次方

Base 128 Varints 编码(压缩算法)的更多相关文章

  1. C# base 64图片编码解码

    使用WinForm实现了图片base64编码解码的 效果图: 示例base 64编码字符串: /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKD ...

  2. RLE行程长度编码压缩算法

    在看emWIN的时候看到一个图片压缩的算法可以有效的对二值图(简单的2中颜色或者更多)进行压缩,压缩的效果可以节省空间而且不丢失信息! 特点 一种压缩过的位图文件格式,RLE压缩方案是一种极其成熟的压 ...

  3. Huffman 编码压缩算法

    前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法.相信大家应该听说过 David Huffman 和他的压缩算法—— Huffman Code,一种通过字 ...

  4. [转载]Huffman编码压缩算法

    转自http://coolshell.cn/articles/7459.html 前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法.相信大家应该听说过 D ...

  5. 解决UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 12: ordinal not in range(128)的编码问题

    当我在运行一个基于scrapy的爬虫时出现UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 12: ordina ...

  6. huffman编码压缩算法(转)

    参考:http://blog.csdn.net/sunmenggmail/article/details/7598012 笔试时遇到的一道题.

  7. zigzag压缩算法

    前文 Base 128 Varints 编码(压缩算法) 介绍了Base 128 Varints这种对数字传输的编码,了解到了这种编码方式是为了最大程度压缩数字的.但是,在前文里,我们只谈论到了正数的 ...

  8. 高效的数据压缩编码方式 Protobuf

    一. protocol buffers 是什么? Protocol buffers 是一种语言中立,平台无关,可扩展的序列化数据的格式,可用于通信协议,数据存储等. Protocol buffers ...

  9. varints

    Protocol Buffer技术详解(数据编码) - Stephen_Liu - 博客园 https://www.cnblogs.com/stephen-liu74/archive/2013/01/ ...

随机推荐

  1. Python【Python基础】

    python的使用 1.python的两个版本:python2.0与python3.0.这两个版本的区别在于python3是不向下兼容python2的组件和扩展的,但是在python2.6和2.7的两 ...

  2. moviepy音视频剪辑:视频剪辑基类VideoClip的__init__构造方法参数has_constant_size的作用

    ☞ ░ 前往老猿Python博文目录 ░ moviepy音视频剪辑模块的视频剪辑基类VideoClip构造方法: __init__(self, make_frame=None, ismask=Fals ...

  3. PyQt(Python+Qt)学习随笔:containers容器类部件QMdiArea多文档界面的QMdiSubWindow子窗口相关属性和操作方法

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 1.增加子窗口 QMdiArea中的子窗口类型是QMdiSubWind ...

  4. Python模块学习遇到的问题

    Python使用import导入模块时报ValueError: source code string cannot contain null bytes的解决方案 Python使用import导入模块 ...

  5. 用Python爬取了三大相亲软件评论区,结果...

    小三:怎么了小二?一副愁眉苦脸的样子. 小二:唉!这不是快过年了吗,家里又催相亲了 ... 小三:现在不是流行网恋吗,你可以试试相亲软件呀. 小二:这玩意靠谱吗? 小三:我也没用过,你自己看看软件评论 ...

  6. Google浏览器PostMan插件版安装步骤

    PostMan插件版安装步骤: 第一步:把下载后的.crx扩展名的离线Chrome插件的文件扩展名改成.zip或者.rar 第二步:右键点击该文件,并使用压缩软件(如winrar.360压缩等)对该压 ...

  7. Xray高级版白嫖破解指南

    啊,阿Sir,免费的还想白嫖?? 好啦好啦不开玩笑 Xray是从长亭洞鉴核心引擎中提取出的社区版漏洞扫描神器,支持主动.被动多种扫描方式,自备盲打平台.可以灵活定义 POC,功能丰富,调用简单,支持 ...

  8. 常见的HTML元素及常见检查点

    1.<select>标签,可创建单选或多选菜单 检查点:下拉列表数据的正确性.数据被选中是否正确.是否变形.是否只读.多选/单选是否正确 2.<label>标签,相当于一个展示 ...

  9. "迎圣诞,拿大奖"赛题——SQLI

    0x01 本题所需知识清单: 1.php sprintf()函数漏洞:https://blog.csdn.net/WQ_BCJ/article/details/85057447 2.布尔盲注基本pla ...

  10. mybatis批量修改数据

    xxxMapper.xml: <update id="updateSensorWarnings" parameterType="java.util.List&quo ...