Google Protobuf里面提出了“Base 128 Varints”编码,这是一种变字节长度的编码,官方描述为:varints是用一个或多个字节序列化整形的一种方法。我理解要点有三个(1)操作是序列化(2)操作对象是整形(3)变长编码。重点是最后一点,他是如何编码的呢?
(1)除了最后一个字节,varint中的每个字节的最高位设为1,表示后面还有字节出现
(2)每个字节的低7位看成是一个组(group),这个组和他相邻的下一个7位组共同存储某个整形的“组合表示”,最低有效组在前面。
上面的定义可能比较生硬,我没看具体例子之前,也没搞明白,我们来看http://code.google.com/intl/zh-CN/apis/protocolbuffers/docs/encoding.html#varints中的例子:
(1)一个字节。下面只有一个字节,所以最高位是0,表示十进制1
0000 0001
(2)两个字节。
1010 1100 0000 0010
由于第一个字节后面还有一个字节,所以第一个字节的最高位设置为1,表示后面还有后继字节,第二个字节的最高位为0。去掉每个字节的最高位,我们对两个字节进行分组。第一个7位组:0101100,第二个7位组:0000010,组合起来就是:0101100 0000010,由于最低有效组在前面,所以两个7位组进行调换,结果为:0000010 0101100,中间的空格是为了大家区分,去掉前面的0,也就是:100101100,十进制为1*2^8 + 1*2^5 + 1*2^3 + 1*2^2 = 256 + 32 + 8 + 4 = 300。
(3)三个字节。我们换种方式,给定某个整形,要求写出他的varint表示,这里当然是落在需要3个字节表示的整形。16380可以吗?不可以!因为16380 < 2^14,所以2个字节足以,我们就以27491为例,27491的二进制表示为:
0110 1011 0110 0011
注意这里是高字节之前,低字节在后,和varint的编码规则相反,首先按照7位一组划分为:0000001 1010110 1100011,然后反转为:1100011 1010110 0000001,最后将末尾的7位组前面补0组成一个字节,两个7位组都补1分别组成一个字节:
11100011 11010110 00000001
(4)更多字节。聪明的你可能发现,varint编码中4个字节最大表示的数为2^28,非常正确,同时说明了天下没有免费的午餐,有得有失。Protobuf引入了fixed32解决这个问题的,如果某个字段经常大于2^28,应当优选fixed32,他是固定长度为32位的。
三.String和bytes
string和bytes的表示形式一致,都是“长度+值”,其中长度采用varint编码,值为字符序列或者二进制码流
分享到:
相关推荐
它的核心编码规则基于Base 128 Varints编码,这是一种压缩整数序列化的方法,能有效节省存储空间,尤其适用于在网络传输或磁盘存储中。 Varints编码的基本原理如下: 1. 每个字节的最高位(msb)作为连续标志,如果...
资源分类:Python库 所属语言:Python 使用前提:需要解压 资源全名:base128-0.1.1-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
有base的乱码,他可以解决 http://u.115.com/file/clnern84# Base解码工具.exe
编码章节解释了Protocol Buffer消息的编码方式,包括如何将消息编码为二进制格式,以及如何处理各种数据类型,例如Base128Varints、有符号整数、非Varint数字、字符串和嵌套消息。特别指出可选和重复字段可以使用...
在这个Demo中,我们主要探讨的是如何使用AES-128-CBC进行数据加密,并通过Base64编码来将加密后的结果转化为可读字符串。 AES-128-CBC的特点在于它使用128位的密钥,这提供了非常高的安全性。在CBC模式下,每个明文...
在这个"nodejs的base64和aes-128-ecb加密.rar"压缩包中,包含的`EncryptTool.js`和`EncryptTool.ts`文件很可能是两个实现Base64编码和AES-128-ECB加密的工具类。接下来,我们将深入探讨这两个知识点。 首先,Base64...
这是一个很好的Base64编-解码工具.转换很方便,支持中文,支持UTF-8,Unicode编码,可对对图片数据进行解码。 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可以参见RFC2045~RFC2049,上面有MIME...
`aes128base64.c`文件很可能是实现AES128加密的源代码,并且可能包含了Base64编码功能,用于将二进制数据转化为可打印的ASCII字符串。 1. **初始化**:在C语言中,首先需要创建一个结构体来存储密钥,然后使用密钥...
在IT领域,编码技术是数据传输和存储中的关键部分,其中Base16、Base32和Base64是常见的编码方式。这些编码方法主要用于将二进制数据转换为可打印的字符,以便在文本格式中方便地处理和传输。本文将深入探讨这三种...
这里我们关注的是两种特殊的编码算法:BASE10和BASE24。这两种算法都是将数字转换为字符串的形式,以便于人类阅读或特定用途的处理。接下来,我们将深入探讨这两种编码方式及其原理。 首先,我们来看BASE10算法。...
Base64和Base32Hex是两种常见的数据编码方式,主要用在将二进制数据转换为可打印的字符格式,以便在网络传输、文本存储等场景下使用。LabVIEW,全称Laboratory Virtual Instrument Engineering Workbench,是一款由...
标题中的"pb9_base64_pb调用base64.dll_PB9base64_Base64.dll_glass8y6_pbbase64"涉及到的是PowerBuilder 9(简称PB9)中关于Base64编码的实现。Base64是一种用于在网络上传输二进制数据的编码方式,它将二进制数据...
在“Base64.zip_labview base64”这个压缩包中,包含了一个名为“Base64.vi”的虚拟仪器(VI)。这个VI是用LabVIEW编写的,目的就是提供一个纯LabVIEW环境下的Base64编码解决方案。下面我们将详细探讨如何在LabVIEW...
在这个特定的场景中,我们关注的是如何在LabVIEW中处理图片,包括图片的缩放、Base64编码和解码。 1. **图片缩放**: 在LabVIEW中,你可以使用图像处理库来实现图片的缩放功能。这个库提供了各种图像操作函数,...
Base64是一种在互联网上广泛使用的编码方式,它将任意二进制数据转换为可打印的ASCII字符,以便在网络传输中不受限制。这种编码方法基于一个64字符的字母数字表,包括大小写字母、数字以及"+"和"/",末尾可能带有...
在JavaScript编程中,Base64和Base32是两种常见的数据编码方式,它们主要用于在网络上传输二进制数据。在本文中,我们将深入探讨这两种编码方法以及如何在JavaScript中实现它们,同时解决在Ajax请求中传递包含特殊...
sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及Java源代码 sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及Java源代码 sun.misc.BASE64Decoder 其中包括 Android Base64Jar包 以及...
Base64编码是一种常见的数据编码方式,主要用于在不支持二进制传输的环境中传递二进制数据。它将任意的二进制数据转化为ASCII字符序列,这样就可以在文本格式的邮件、网页源代码等场景中方便地使用。Base64编码会将3...