zoukankan      html  css  js  c++  java
  • 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次方

  • 相关阅读:
    云计算在未来发展中的重要性体现在哪里?
    四大优势凸显,云计算成大势所趋
    边缘计算的今天、明天和未来
    以太坊年底前这5件大事,能否带来大惊喜?
    量子计算是什么?它到底有什么用?
    加快边缘计算发展的十大趋势
    树结构练习——排序二叉树的中序遍历
    树结构练习——排序二叉树的中序遍历
    数据结构实验之二叉树的建立与遍历
    数据结构实验之二叉树的建立与遍历
  • 原文地址:https://www.cnblogs.com/billmiao/p/9872160.html
Copyright © 2011-2022 走看看