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

时间:2017-04-11 17:33:38

标签: python c++ binaryfiles

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

我最感兴趣的是python和C / C ++。例如,当我使用pickle(或gzipped)文件时,python“知道”原始对象是否具有某个方法或属性,而不是我投射未打开的对象或指示其类型,我总是想知道如何实现。我不知道如何在Google上查看这些内容,因为它可能与这些语言的设计方式有关。任何指针都将非常感激。

2 个答案:

答案 0 :(得分:2)

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

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

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

有关这方面的工作原理,请查看msgpack specCap'n'Proto Encoding Spec(Cap&#39; n&#39; Proto是另一种序列化格式,有点低级别格式)。< / p>

对于Python pickle,PEP 3154有协议4规范,当然还有source code of the picke module

答案 1 :(得分:1)

二进制文件包含数据。

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

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

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

BTW,文件格式与用于阅读它们的语言无关。可以使用FORTRAN或BASIC读取gzip压缩文件。