C++/Python 中对象和结构的二进制文件结构

Binary files structure for objects and structs in C++/Python

本文关键字:结构 二进制 文件结构 对象 Python C++      更新时间:2023-10-16

我有一个关于二进制数据文件的简单(也许是愚蠢的)问题。如果使用简单类型(int/float/..),则很容易想象二进制文件的结构(浮点数序列,每个浮点数使用固定数量的字节写入)。但是结构、对象和功能呢?对于变量名称/属性/方法的编写顺序,每种语言是否有某种召集,如果是这样,是否可以更改和保管此顺序?否则,是否有某种标题来描述每个文件中使用的格式?

我最感兴趣的是python和C/C++。例如,当我使用酸洗(或 gzipped)文件时,python "知道"原始对象是否具有某个方法或属性,而无需我强制转换未腌制的对象或指示其类型,我一直想知道它是如何实现的。我不知道如何在谷歌上查找这个,因为它可能与这些语言的设计方式有关。任何指示将不胜感激。

它被称为序列化- 因为它是关于将内存数据结构序列化为线性字节流 - 文件。

基本算法类似于"遍历字典中的所有键和值(或列表中的所有键)并将它们打印到文件中"。但是您必须先指定一种格式- 如果您存储一个字符串,您如何知道它何时结束?好吧,你必须首先存储它的长度,或者使用某种字符串结尾标记(如 JSON 中的")。

一些广泛用于自定义数据的序列化格式是JSON,YAML,XML,MessagePack,Google Protocol Buffers...

要了解它是如何工作的,请查看例如msgpack规范或Cap'n'Proto编码规范(Cap'n'Proto是另一种序列化格式,有点低级)。

对于 Python pickle,有协议 4 规范的 PEP 3154,当然还有 picke 模块的源代码。

二进制文件包含数据。

二进制文件的数据布局过多。 一些示例包括JPEG,可执行文件,文字处理器,原始文本和存档文件。

文件可能具有指示布局的扩展名。 例如,".png"很可能遵循 PNG 格式。 "bin"或"dat"扩展是通用的。 可以压缩文件并使用"png"扩展名命名存档。

如果没有文件扩展名或操作系统不存储文件类型,则文件的格式基于发现(或尝试随机格式)。 某些文件格式中包含完整性值,以帮助验证正确性。 了解完整性值及其计算方式有助于对格式类型进行分类。 同样,没有保证。

顺便说一句,文件格式与用于读取它们的语言无关。 可以使用FORTRAN或BASIC读取gzip文件。