首页
学习
活动
专区
圈层
工具
发布

DDIA 读书分享 第四章:编码和演化

第三章讲了存储引擎,本章继续下探,探讨编码相关问题。 所有涉及跨进程通信的地方,都需要对数据进行编码(Encoding),或者说序列化(Serialization)。...为什么内存中数据和外存、网络中的会有如此不同呢? 在内存中,借助编译器,我们可以将内存解释为各种数据结构;但在文件系统和网络中,我们只能通过 seek\read 等几个有限的操作来流式的读取字节流。...Protocol Buffers 编码逐字节解析 字段标号和模式演变 模式,即有哪些字段,字段分别为什么类型。 随着时间的推移,业务总会发生变化,我们也不可避免的增删字段,修改字段类型,即模式演变。...仍是编码之前例子,Avro 只用了 32 个字节,为什么呢? 他没有编入类型。...更改字段名和在 union 中添加类型,都是向后兼容,但是不能向前兼容的,想想为什么? 如何从编码中获取写入模式 对于一段给定的 Avro 编码数据,Reader 如何从其中获得其对应的写入模式?

1.6K20

使用 Google 的 Protobuf 序列化数据如何不保护您的网络应用程序。

在 Web 应用程序的活动中,我们遇到了一个奇怪的目标行为,事实上,在 HTTP 拦截期间,数据似乎以 base64 编码,但在解码响应后,我们注意到数据是二进制格式。...: 乍一看,这些消息似乎只是简单地进行了 base64 编码。...使用我们的输入数据和返回的输出数据运行脚本,我们得到以下输出: 如我们所见,请求消息包含两个字段: 字段 1:要在数据库中搜索的字符串。...要手动检查这一点,我们必须使用 Protobuf 编译器序列化我们的有效负载,然后在将其发送到 base64 中对其进行编码。...第 4 步 - 对篡改进行编码 在我们了解了 Protobuf 编码过程的行为之后,编写一个 sqlmap 篡改程序就是小菜一碟。 #!

2.1K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    IM通讯协议专题学习(八):金蝶随手记团队的Protobuf应用实践(原理篇)

    进行编码,得到的二进制数据仅有20个字节:0a046a6f 6a6f1001 1a0a3132 33407171 2e636f6d4、编码原理相对于基于纯文本的数据结构如 JSON、XML等,Protobuf...ZigZag 编码按照数字的绝对值进行升序排序,将整数通过一个 hash 函数h(n) = (n>31)(如果是 sint64 h(n) = (n>63))转换为递增的...关于为什么 64 的 ZigZag 为 80 01,《整数压缩编码 ZigZag》中有关于其编码唯一可译性的解释。通过 ZigZag 编码,只要绝对值小的数字,都可以用较少位的 byte 表示。...每种类型的序号可以从这张表得到:需要注意,对于string类型的数据(在上表中第三行),由于其长度是不定的,所以 T-V的消息结构是不能满足的,需要增加一个标识长度的Length字段,即T-L-V结构。...尽管我们没有直接调用它的函数,但是Descriptor在“根据 type name 创建具体类型的 Message 对象”中扮演了重要的角色,起了桥梁作用。

    86420

    IM通讯协议专题学习(三):由浅入深,从根上理解Protobuf的编解码原理

    四):从Base64到Protobuf,详解Protobuf的数据编码原理》(稍后发布..)...可见:同样一串二进制在不同的“上下文/协议”下有完全不一样的解读,这也是为什么计算机明明只认知0和1但是却能处理非常复杂任务的根本原因,因为一切都可以编码为0和1,同样的我们也可以从0和1中解析出我们想要的信息...所以我们可以看到,无论你用多么复杂的字段名称也不会影响编码后占据的空间,字段名称根本就不会出现在编码后的信息中,so clever。...从本质上讲,Protobuf被编码后形成一系列的key-value,每个key-value对应一个proto中的字段。...而Protobuf也一样,Protobuf也是一门语言,会将可读性较好的消息编码为二进制从而可以在网络中进行传播,而对端也可以将其解码回来。

    71440

    ProtoBuf 入门详解

    2.生成工具函数代码:接下来,我们需要使用 protobuf 编译器(protoc)处理.proto文件,生成对应目标语言(如C++、Java、Python等)的源代码。...相比之下,Protobuf 序列化后的数据是二进制字节流,它并不适合人类阅读,且必须通过特定的反序列化函数才能正确解读数据。...在使用 JSON 序列化数据时,其结果中往往包含人类刻度的字段名称,例如 { "id": "123456" } ,但是在 protobuf 中,序列化后的结果中只会包含字段编号而非字段名称,例如在本例中...这三个字节分别对应了 protobuf 编码的三个内容:(在 protobuf 中每个字节的首位都是控制位,用于表示随后的字节是否需要和自己属于同一个字段) Tag 标签由字段编号与字段类型组成,其编码格式为...这就是为什么对于频繁使用的字段最好将其字段编号设置在 [1,15] 之间,因为这样编码后的 tag 部分只会占据一个字节,能有效利用空间。

    2.5K74

    Protobuf 才是高效通信的王者!

    序列化过程 判断每个字段是否 有设置值,有值才进行编码。 根据字段标识号与数据类型,将字段值通过不同的编码方式进行编码。 将编码后的数据块按照字段类型采用不同的数据存储方式 封装成二进制数据流。...变长编码方式 Protobuf 在处理 整型字段 时,采用了非常高效的编码机制:VarInt 编码 和 ZigZag 编码 VarInt 编码:每个字节的最高位(MSB)用于指示是否还有更多字节,剩余...特别是对于负数,这样编码后即使是-1,也只需要一个字节,而不像 int32 那样需要5个字节 3.3 Protobuf 中不同整型的区别 类型 有符号 编码方式 说明 int32 是 Varint 可能需要...ProtoBuf 的数据表示方式:其是高效的 二进制序列化协议,它通过 字段编号 来标识数据与变量之间的映射关系 字段编号的作用: 在 Protobuf 中,每个成员变量都需要一个类内唯一的字段编号。...Protobuf 解析时,根据字段编号回到 message 定义中查找对应的变量和类型,然后用相应类型的解析规则解析后续数据。

    89910

    轻松搞定 Protobuf:高效数据序列化的神器

    四、Protobuf 的编码和解码:数据的进进出出 Protobuf 的编码和解码原理是其高效性的关键所在。Protobuf 使用二进制格式进行数据序列化,具有较小的体积和较快的编解码速度。...如果遇到未知的字段,解码器可以安全地忽略它,这使得 Protobuf 具有良好的向前兼容性。 在实际项目中,我们通常不需要手动进行编码和解码。...五、Protobuf 的性能优化:让数据序列化更快更省 想要充分发挥 Protobuf 的潜力,我们需要对其性能进行优化。...如果整数值较小,可以使用 varint 编码的 int32 或 int64 类型,它们在编码时会占用更少的字节。...合理设置字段编号:字段编号在 1 到 15 的范围内使用一个字节进行编码,而 16 到 2047 之间的编号需要两个字节。

    1.6K10

    IM通讯协议专题学习(十):初识 Thrift 序列化协议

    2、系列文章 本文是系列文章中的第 10 篇,本系列总目录如下: 《IM通讯协议专题学习(一):Protobuf从入门到精通,一篇就够!》...《IM通讯协议专题学习(二):快速理解Protobuf的背景、原理、使用、优缺点》 《IM通讯协议专题学习(三):由浅入深,从根上理解Protobuf的编解码原理》 《IM通讯协议专题学习(四):从Base64...举个 🌰,对 i32 类型的 7 进行编码,可以说前面 3 个字节都浪费了: 00000000 00000000 00000000 00000111 解决思路:将整数类型由定长存储转为变长存储...:为什么取名叫 zigzag?...3)修改字段名: 不破坏兼容性,因为 binary 协议不会对 name 进行编码。

    62800

    【ProtoBuf】文件编写及序列化

    这⾥再提⼀下为什么要定义消息? 在网络传输中,我们需要为传输双⽅定制协议。定制协议说白了就是定义结构体或者结构化数据, 比如,tcp,udp 报文就是结构化的。...和 ASCII 编码的字符串,⻓度不能超过2^32 string bytes 可能包含任意的字节序列但长度不能超过2^32 string 注意:【1】变长编码是指:经过protobuf编码后,原本4字节或...值得⼀提的是,范围为 1 ~ 15 的字段编号需要⼀个字节进⾏编码, 16 ~ 2047 内的数字需要两个字节 进⾏编码。编码后的字节不仅只包含了编号,还包含了字段类型。...序列化的 API 函数均为const成员函数,因为序列化不会改变类对象的内容, 而是将序列化的结果保存到函数入参指定的地址中。...依赖生成的接口,将编译生成的头⽂件包含进我们的代码中,实现对 .proto 文件中定义的字段进行设置和获取,和对 message 对象进⾏序列化和反序列化。

    78310

    转载:【AI系统】推理文件格式

    该函数使用 Python 的 pickle 实用程序进行序列化。使用此函数可以保存各种对象的模型、张量和字典。...Protobuf 采用 TLV 编码模式,即把一个信息按照 tag-length-value 的模式进行编码。...tag 和 value 部分类似于字典的 key 和 value,tag 标识字段的类型和唯一性,它是一个整数,表示字段号和数据类型。Protobuf 中,Tag 是通过字段号和数据类型组合编码的。...在 Protobuf 中,Tag 的编码结合了字段号和数据类型,具体采用 Varint 编码方式:字段号(Field Number)唯一标识消息中的字段,值为正整数。...以下是具体的步骤:编码过程: 首先构建消息结构,根据.proto文件定义的消息结构,构建消息对象;然后对逐个字段进行编码,编码 Tag(将字段号和线类型编码成 Tag)、Length(对于可变长数据类型

    1.1K10

    浅谈 Protobuf 编码

    0x00 Before you start 简单来说,Protobuf 的编码是基于变种的 Base128。在学习 Protobuf 编码或是 Base128 之前,先来了解下 Base64 编码。...另外,Base64 编码是按照 6 bits 为一组进行编码,每 3 个字节的原始数据要用 4 个字节来储存,编码后的长度要为 4 的整数倍,不足 4 字节的部分要使用 pad 补齐,所以最终的编码结果为...任意的字节流均可以使用 Base 64 进行编码,编码之后所有字节均可以用数字、字母和 + / = 号进行表示,这些都是可以被正常显示的 ascii 字符,即“安全”的字节。...序列化后的消息字段顺序是不稳定的。 对同一段字节流进行解码,不同实现或版本的 Protobuf 解码得到的结果不一定完全相同(bytes 层面)。...+ 使用了不同语言实现的 Protobuf,并且以不同的顺序编码字段。+ 消息中的字段使用了不稳定的算法进行序列化。

    2.2K40

    IM通讯协议专题学习(七):手把手教你如何在NodeJS中从零使用Protobuf

    到Protobuf,详解Protobuf的数据编码原理》《IM通讯协议专题学习(五):Protobuf到底比JSON快几倍?...由于protobuf协议相较于之前流行的XML更加的简洁高效(后面会提到这是为什么),因此许多后台接口都是基于protobuf定制的数据序列化协议。...opt 是一个可选的成员,即消息中可以不包含该成员。1、2、3这几个数字是这三个字段的唯一标识符,这些标识符是用来在消息的二进制格式中识别各个字段的,一旦开始使用就不能够再改变。...9、总结一下Protobuf9.1 优点简单说来 Protobuf 的主要优点就是:简洁,快。为什么这么说呢?...对于代码清单 1 中的消息,用 Protobuf 序列化后的字节序列为:08 65 12 06 48 65 6C 6C 6F 77而如果用 XML,则类似这样:31 30 31 3C 2F 69 64

    1.7K30

    【AI系统】推理文件格式

    该函数使用 Python 的 pickle 实用程序进行序列化。使用此函数可以保存各种对象的模型、张量和字典。...Protobuf 采用 TLV 编码模式,即把一个信息按照 tag-length-value 的模式进行编码。...tag 和 value 部分类似于字典的 key 和 value,tag 标识字段的类型和唯一性,它是一个整数,表示字段号和数据类型。Protobuf 中,Tag 是通过字段号和数据类型组合编码的。...在 Protobuf 中,Tag 的编码结合了字段号和数据类型,具体采用 Varint 编码方式:字段号(Field Number)唯一标识消息中的字段,值为正整数。...以下是具体的步骤:编码过程: 首先构建消息结构,根据.proto文件定义的消息结构,构建消息对象;然后对逐个字段进行编码,编码 Tag(将字段号和线类型编码成 Tag)、Length(对于可变长数据类型

    1.2K10

    你为什么使用RPC

    简单的说,RPC就是在一个应用程序/服务中像本地函数调用一样去访问网络上的另一个应用程序/服务中的函数。...同时无法清晰、准确地描述复杂的结构体。 gRPC HTTP2.0 Protobuf: 二进制编码,对字段名做了优化,有超高的压缩率。...客户端侧则通过桩代码中的函数,调用接口。 protocol buffer协议的特点 指定字段类型: 每个字段的类型是确定的 给每个字段分配序号: 每个字段都分配了一个标号。在数据压缩时及其重要。...转为string就需要占用3个字节; 如果使用Protobuf的编码Encoding, 字段类型可以使用标号替代,占用的体积更少。...3. protobuf的可读性比HTTP-Json差 (缺点) 因为protobuf序列化后是一些二进制字节,而且字段名也被替换为标号了, 因为肉眼是无法识别其含义的。不具备可读性。

    52520

    【Coding】聊聊字符编码那些事儿

    在Python中,使用print函数输出,会自动转换为十进制数,如下: 当然,也可以使用int()函数来进行转换,不需要带前缀: 注意:被转换的数据必须以...ASCII码 首先,ASCII码是一种字符编码方式,我们为什么要对字符进行编码呢?...在python2中,使用ord()函数,可以得出字符的ASCII码(十进制) 使用chr()函数,可以得出ASCII码所对应的字符: ASCII码只包含128...ord()函数在Python3中查看的是Unicode编码,不再是ASCII码了。 以“中国”为例,我们来看看Unicode的表示方法。...使用python3编码(加b表示bytes类型): 使用python3解码: base64对二进制数进行编码,因此主要处理对象是二进制文件

    1.9K20

    Protobuf 语言指南(proto3)

    这些标识符是用来在消息的二进制格式中识别各个字段的,一旦开始使用就不能够再改变。注:[1,15]之内的标识号在编码的时候会占用一个字节。[16,2047]之内的标识号则占用2个字节。...最小的标识号可以从1开始,最大到2^29 - 1, or 536,870,911。不可以使用其中的[19000-19999]的标识号, Protobuf协议实现中对这些进行了预留。...string``bytes只要字节是有效的UTF-8 ,它们是兼容的。 bytes如果字节包含消息的编码版本,则嵌入消息是兼容的。...在Python中,package指令被忽略,因为Python模块是根据它们在文件系统中的位置进行组织的。...bytes base64 string "YWJjMTIzIT8kKiYoKSctPUB+" JSON值将是使用带填充的标准base64编码编码为字符串的数据。

    6.4K40
    领券