C++/Python 中对象和结构的二进制文件结构
Binary files structure for objects and structs in C++/Python
我有一个关于二进制数据文件的简单(也许是愚蠢的)问题。如果使用简单类型(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文件。
- 将内部带有矢量的结构保存/读取到二进制文件中
- 如何使用位字段将数据从二进制文件复制到结构中?
- 如何使用 redis-plus-plus 存储二进制数据,就像我想存储结构一样?@for_stack?
- 用二进制文件填充结构
- 在C++中将结构转换和存储为二进制
- 如何在Qt中使用QDataStream将自定义结构保存/加载到二进制文件中?
- 如何二进制搜索结构向量并在适当的索引处插入
- 将结构写入二进制文件后,该文件仍然具有正常字符,而不是不可读字符
- 在排序链表中插入结构并将其写入二进制文件
- 从包含 IP 标头片段的二进制文件中读取结构的最佳方法是什么
- 使用结构读取和写入二进制文件
- 二进制树数据结构
- 将结构编写为二进制,其中一个成员是字符串
- 从二进制文件中读取指向内存的二进制文件的结构
- 用ifstream read()读取二进制的结构
- 如何在结构中存储二进制文件数据
- C++/Python 中对象和结构的二进制文件结构
- (C++) 如何从要存储在结构数组中的二进制文件中读取.dat信息?
- C++结构二进制文件
- 读取结构C++二进制文件的运行时错误