Base 128 Varints 编码(压缩算法)
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 编码(压缩算法)的更多相关文章
- C# base 64图片编码解码
使用WinForm实现了图片base64编码解码的 效果图: 示例base 64编码字符串: /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKD ...
- RLE行程长度编码压缩算法
在看emWIN的时候看到一个图片压缩的算法可以有效的对二值图(简单的2中颜色或者更多)进行压缩,压缩的效果可以节省空间而且不丢失信息! 特点 一种压缩过的位图文件格式,RLE压缩方案是一种极其成熟的压 ...
- Huffman 编码压缩算法
前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法.相信大家应该听说过 David Huffman 和他的压缩算法—— Huffman Code,一种通过字 ...
- [转载]Huffman编码压缩算法
转自http://coolshell.cn/articles/7459.html 前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法.相信大家应该听说过 D ...
- 解决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 ...
- huffman编码压缩算法(转)
参考:http://blog.csdn.net/sunmenggmail/article/details/7598012 笔试时遇到的一道题.
- zigzag压缩算法
前文 Base 128 Varints 编码(压缩算法) 介绍了Base 128 Varints这种对数字传输的编码,了解到了这种编码方式是为了最大程度压缩数字的.但是,在前文里,我们只谈论到了正数的 ...
- 高效的数据压缩编码方式 Protobuf
一. protocol buffers 是什么? Protocol buffers 是一种语言中立,平台无关,可扩展的序列化数据的格式,可用于通信协议,数据存储等. Protocol buffers ...
- varints
Protocol Buffer技术详解(数据编码) - Stephen_Liu - 博客园 https://www.cnblogs.com/stephen-liu74/archive/2013/01/ ...
随机推荐
- SpringCloud 源码系列(3)—— 注册中心 Eureka(下)
十一.Eureka Server 集群 在实际的生产环境中,可能有几十个或者几百个的微服务实例,Eureka Server 承担了非常高的负载,而且为了保证注册中心高可用,一般都要部署成集群的,下面就 ...
- PHP 的$server变量
PHP中$_SERVER["QUERY_STRING"]函数 详解PHP中$_SERVER函数的QUERY_STRING和 $_SERVER存储当前服务器信息,其中有几个值 如 ...
- PHP代码审计分段讲解(2)
03 多重加密 源代码为: <?php include 'common.php'; $requset = array_merge($_GET, $_POST, $_SESSION, $_COOK ...
- js- for in 循环 只有一个目的,遍历 对象,通过对象属性的个数 控制循环圈数
for in 循环会返回 原型 以及原型链上面的属性,不会打印系统自带的属性 var obj ={ name:'suan', sex :'male', age:150, height:185, ...
- Alpha冲刺——序言篇(任务与计划)
Alpha冲刺--序言篇(任务与计划) 1.整个项目预期的任务量 需求规格说明书 架构设计,原型设计,原型改进(给目标用户展现原型,并进一步理解需求) 编码规范完成.平台环境搭建完成.初步架构搭建 队 ...
- 【学习笔记】K-D tree 区域查询时间复杂度简易证明
查询算法的流程 如果查询与当前结点的区域无交集,直接跳出. 如果查询将当前结点的区域包含,直接跳出并上传答案. 有交集但不包含,继续递归求解. K-D Tree 如何划分区域 可以借助下文图片理解. ...
- uni-app微信小程序登录授权
微信小程序授权是非常简单和常用的功能,但为了方便,还是在此记录一下要点: 首先是需要用到一个授权按钮来触发获取用户信息授权: 关键在于 open-type 为 getUserInfo , 然后有个@g ...
- Spring AOP的理解(通俗易懂)。
转载 原文链接:http://www.verydemo.com/demo_c143_i20837.html 这种在运行时,动态地将代码切入到类的指定方法.指定位置上的编程思想就是面向切面的编程. 1. ...
- Day2 之 元组tuple
tuple 元组 也是有序列表 ,与list非常相似,但是tuple一旦初始化就不能修改. name = ('a','b',1,2,3,True) tuple ...
- go并发之goroutine和channel,并发控制入门篇
并发的概念及其重要性 这段是简单科普,大佬可以跳过 并发:并发程序指同时进行多个任务的程序.在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行 ...