0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Google二进制编解码技术之Protobuf 2

jf_78858299 ? 来源: 码农的荒岛求生 ? 作者:陆小风 ? 2023-02-15 14:28 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

protobuf是怎样实现的?

首先,我们来思考最简单的情况,该怎样表示数字。

你可能会想这还不简单,统一用固定长度,比如用64个比特(8字节),这种方法可行,但问题是不论一个数字有多小,比方2,那么用这种方法表示2也需要占据64个比特(8字节):图片

明明只要一个字节就能表示而我们却用了8个,前面的全都是0,这也太奢侈太浪费了吧。

显然,在这里我们不能使用固定长度来表示数字,而需要使用变长方法来表示。

什么叫变长?意思是说如果数字本身比较大,那么其使用的比特位可以较多,但如果数字很小那么就应该使用较少的比特位来表示,这就叫变长,随机应变,不死板。

那怎样变长呢?

我们规定:对于每一个字节来说,第一个比特位如果是1那么表示接下来的一个比特依然要用来解释为一个数字,如果第一个比特为0,那么说明接下来的一个字节不是用来表示该数字的。

也就是说对于每个8个比特(1字节)来说,它的有效载荷是7个比特,第一个比特仅仅用来标记是否还应该把接下来的一个字节解析为数字。

根据这个规定假设来了这样一串01二进制:

1010110000000010

根据规定,我们首先取出第一个字节,也就是:

10101100

此时我们发现第一个比特位是1,因此我们知道接下来的一个字节也属于该数字,将当前字节的1去掉就是:

0101100

然后我们看下一个字节:

00000010

我们发现第一个bit为0,因此我们知道下一个字节不属于该数字了。

接下来我们将解析到的0101100(第一个字节去掉第一个比特位)以及第二个字节0000010(第二个字节去掉第一个比特位)翻转之后拼接到一起,这里之所以翻转是因为我们规定数字的高位在后。

这个过程就是:

1010110000000010  
->  10101100 | 00000010 // 解析得到两个字节
    _          _
 
->  0101100  |  0000010  // 各自去掉最高位 
->  0000010  |  0101100  // 两个字节翻转顺序

    0000010  +  0101100
->  100101100           // 拼接

最后我们得到了100101100,这一串二进制表示数字300。

这种数字的变长表示方法在protobuf中被称之为varint。

因此在这种表示方法下,如果数字较大,那么使用的比特就多,如果数字较小那么使用比特就少,聪明吧。

有的同学看到这里可能会问题,刚才讲解的方法只能表示无符号数字,那么有符号数字该怎么表示呢?比如-2该怎么表示?

有符号数的表示

按照刚才变长编码的思想,-2147483646使用的比特位应该比-2要少。

然而我们知道在计算机世界中负数使用补码表示的,也就是说最高位(最左侧的比特位)一定是1,假设我们使用64位来表示数字,那么如果我们依然用补码来表示数字的话那么无论这个负数有多大还是多小都需要占据10个字节的空间。

为什么是10个字节呢?

不要忘了varint每个字节的有效负荷是7个比特,那么对于需要64位表示的数字来说就需要64/7向上取整也就是10个字节来表示。

这显然不能满足我们对数字变长存储的要求。

该怎么解决这个问题呢?

既然无符号数字可以方便的进行变长编码,那么我们将有符号数字映射称为无符号数字不就可以了 ,这就是所谓的ZigZag编码,是不是很聪明,就像这样:

原始信息      编码后
0            0 
-1           1 
1            2
-2           3
2            4
-3           5
3            6

...          ...

2147483647   4294967294
-2147483648  4294967295

这样我们就可以将有符号数字转为无符号数字,接收方接收到该数据后再恢复出有符号数字。

现在数字的问题彻底解决了,但这仅仅是万里长征第一步。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 计算机
    +关注

    关注

    19

    文章

    7696

    浏览量

    91265
  • Server
    +关注

    关注

    0

    文章

    94

    浏览量

    24869
  • 网络编程
    +关注

    关注

    0

    文章

    72

    浏览量

    10701
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    探讨2对4二进制解码器及4到16二进制解码器配置

    二进制解码器是由单独的逻辑门构成的另一种组合逻辑电路,与编码器完全相反。名称“解码器”是指将编码信息从一种格式转换或解码为另一种格式,因此二进制
    的头像 发表于 12-29 12:10 ?1.2w次阅读
    探讨<b class='flag-5'>2</b>对4<b class='flag-5'>二进制</b><b class='flag-5'>解码</b>器及4到16<b class='flag-5'>二进制</b><b class='flag-5'>解码</b>器配置

    二进制相对调相(二进制差分调相2DPSK)的工作原理

    二进制相对调相(二进制差分调相2DPSK)的工作原理
    发表于 10-21 13:01 ?3355次阅读
    <b class='flag-5'>二进制</b>相对调相(<b class='flag-5'>二进制</b>差分调相<b class='flag-5'>2</b>DPSK)的工作原理

    二进制

    二进制   二进制与十进制的区别在于数码的个数和进位规律有很大的区别,顾名思义,二进制的计数规律为逢二进一,是以
    发表于 04-06 23:48 ?8564次阅读
    <b class='flag-5'>二进制</b>

    二进制编码和二进制数据

    二进制编码和二进制数据   二进制编码是计算机内使用最多的码制,它只使用两个基本符号"0"和"1",并且通过由这两个符号组成的
    发表于 10-13 16:22 ?5044次阅读

    什么是二进制计数器,二进制计数器原理是什么?

    什么是二进制计数器,二进制计数器原理是什么? 计数器是数字系统中用得较多的基本逻辑器件。它不仅能记录输入时钟脉冲的个数,还可以实现
    发表于 03-08 13:16 ?3.2w次阅读

    二进制电平,什么是二进制电平

    二进制电平,什么是二进制电平 在二进制数字通信系统中,每个码元或每个符号只能是“1”和“0”两个状态之一。若将每个码元可能取的状态增
    发表于 03-17 16:51 ?2538次阅读

    二进制加法程序【汇编版】

    二进制加法程序【汇编版】二进制加法程序【汇编版】二进制加法程序【汇编版】二进制加法程序【汇编版】
    发表于 12-29 11:02 ?0次下载

    二进制加法程序【C语言版】

    二进制加法程序【C语言版】二进制加法程序【C语言版】二进制加法程序【C语言版】二进制加法程序【C语言版】
    发表于 12-29 11:03 ?0次下载

    二进制数据压缩算法

    二进制数据压缩算法二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢
    的头像 发表于 02-28 09:31 ?2.1w次阅读

    二进制编码的十进制表示转换解码

    二进制编码小数的主要优点是它允许在decimal(base-10)和binary(base-2)表单之间轻松转换。但是,缺点是BCD代码是浪费的,因为不使用 1010 (十进制10)和 1111 (十
    的头像 发表于 06-24 09:31 ?1.5w次阅读
    <b class='flag-5'>二进制</b>编码的十<b class='flag-5'>进制</b>表示转换<b class='flag-5'>解码</b>器

    二进制如何转换为十进制?

    二进制转换为十进制(base-2到base-10) )数字和背面是一个重要的概念,因为二进制编号系统构成了所有计算机和数字系统的基础。
    的头像 发表于 06-22 10:21 ?2.5w次阅读

    二进制解码器案例说明

    二进制解码器是另一种由各个逻辑门构成的组合逻辑电路,与编码器完全相反。
    的头像 发表于 06-22 09:41 ?1w次阅读
    <b class='flag-5'>二进制</b><b class='flag-5'>解码</b>器案例说明

    二进制解码器到底是什么

    二进制解码器是由单独的逻辑门构成的另一种组合逻辑电路,与编码器完全相反。名称“解码器”是指将编码信息从一种格式转换或解码为另一种格式,因此二进制
    发表于 01-03 17:42 ?6745次阅读
    <b class='flag-5'>二进制</b><b class='flag-5'>解码</b>器到底是什么

    二进制解码器开源设计

    电子发烧友网站提供《二进制解码器开源设计.zip》资料免费下载
    发表于 06-16 15:01 ?0次下载
    <b class='flag-5'>二进制</b><b class='flag-5'>解码</b>器开源设计

    二进制编码器工作原理 如何选择二进制编码器

    编码器通常有多个输入端(通常为2的n次方个,其中n是编码器的位数),和一个或多个输出端。每个输入端对应一个二进制位,而输出端则表示输入的二进制值。 优先编码器 : 优先编码器是一种特殊的二进制
    的头像 发表于 11-06 09:44 ?2695次阅读