如何记录文件格式规范


12

对于一个项目,我需要使用一些旧游戏和相关软件中的各种文件类型-配置文件,保存,资源档案等。这些文件的大部分尚未记录,也没有与之配合使用的工具,因此我必须对这些格式进行反向工程并构建自己的库来处理它们。

尽管我认为大多数需求不大,但我打算发表自己的努力成果。是否有记录文件格式的公认标准?环顾四周,有几种正在使用的样式:有些样式(如.ZIP文件格式规范)非常罗;;有些样式则非常冗长。其他的,例如XentaxWiki上的,则更为简洁-我发现其中一些难以阅读;我个人最喜欢的是对PlayStation 2存储卡文件系统的描述,其中包括详细的描述性文字和一些带偏移量的“内存映射”等,它也与我的用例最匹配。对于不同的格式,它会有所不同,但是似乎应该有一些我应该遵循的一般原则。

编辑:我似乎没有很好地解释我想做什么。让我构造一个例子。

我可能有一些旧软件,将其配置存储在一个“二进制”文件中-一系列位域,整数,字符串以及所有这些东西被粘在一起并被程序理解,但不是人类可读的。我破译了。我希望以一种人类可读的方式准确记录该文件的格式,作为实现库以解析和修改此文件的规范。此外,我希望其他人可以轻松理解这一点。

可以使用多种方法来编写此类文档。上面的PKZIP示例非常冗长,主要以自由文本形式描述文件格式。PS2示例提供了值类型,偏移量和大小的表,并对它们的含义进行了广泛注释。许多其他变量(例如XentaxWiki上的变量)仅列出变量类型和大小,几乎没有注释。

我问是否有类似于编码样式指南的标准,该指南提供了有关如何编写此类文档的指南。如果没有,那么有没有我应该效仿的著名例子?如果不是,那么至少有人可以总结一些有用的建议吗?



哈!我知道那感觉。我正在查看的一种格式实际上是编写该文件的原始源代码。问题在于,变量的写入顺序与结构定义中的顺序不同,而变量之间夹杂了一些额外的内容。关于补偿的评论是错误的。这是激发这个问题的部分原因-强烈希望做到这一点。
Sopoforic

1
我对书面反向工程文件类型的唯一经验是来自wiibrew.org。如果我没记错的话,他们将文件记录为struct。效果很好。
MetaFight 2014年

1
我可能对这个问题有误解,但似乎您正在寻找EBNF之类的东西。

@MattFenwick:BNF用于指定语言的语法;不完全是我的追求。我将进行编辑以更清楚地说明我的意思是哪种文件格式。
Sopoforic

Answers:


4

二进制文件只是按照某些规则排列成逻辑单元的一系列位。这些规则通常称为语法。语法可分为四种类型(Chomsky层次结构),对于无上下文语法,您应使用Matt Fenwick在其评论中指出的扩展Backus-Naur形式。存储在文件中的序列的解释(或语义)可以通过语言进行描述,也可以使用带有注释的示例程序对信息进行序列化和反序列化。

要了解有关记录二进制文件格式的更多信息,建议阅读ASN.1标准


从技术上讲,大多数配置文件都具有上下文无关的语言,因为它们具有有限的语言。实际上,在EBNF中编写“所有2字节字符串的集合”(例如,对于一个只有16个项目的位域的配置文件)不会告诉任何人任何东西。指向ASN.1标准的指针是我得到的答案的最接近的东西,尽管看起来ASN.1中的规范是要由计算机读取的,并且我希望获得有关编写人类文档的信息。但是,如果没有更符合我要求的东西出现,我很快会接受这个答案。谢谢你的协助。
Sopoforic

2

这很奇怪,因为快速搜索文件格式会引出Wikipedia文章(文件格式列表)。它还包括几种视频游戏数据格式。

支持文件系统的系统上的视频游戏的数据的通用文件格式列表,最常见的是PC游戏。

它还包括多种视频游戏存储媒体格式。

当将游戏的ROM映像或存储介质从原始ROM设备复制到诸如硬盘之类的外部存储器以用于备份目的或使游戏可在模拟器上进行播放时,最常用的文件扩展名列表。对于基于卡式盒的软件,如果未使用平台特定的扩展名,则通常使用文件扩展名“ .rom”或“ .bin”来说明该文件包含ROM内容的副本。ROM,磁盘或磁带映像通常不包含单个文件或ROM,而是包含在备份介质上单个文件中的整个文件或ROM结构。


是否有记录文件格式的公认标准?

任何地方都没有“官方”标准。由于文件格式是由公司制作的,因此公司会决定文档的格式。


2
我认为您误解了我的问题。当然,已经记录了许多文件格式-我提到了XentaxWiki,其中包括超过1500种。但是我感兴趣的文件通常没有记录在案-与游戏相关的事情,例如保存文件或配置,通常不是常规的容器格式。我的情况是没有文档,我打算写一些文档-那么该怎么做?
Sopoforic

记录所有其他文件格式的方式相同。
罗伯特·哈维2014年

4
@RobertHarvey:混淆,冲突,不准确和不完整?认真地说,但是,正如我提到的那样,我注意到了几种不同的通用样式。我对这方面的工作还不太熟悉,无法确定是否需要任何特定的样式。XentaxWiki(我所见过的最大的资源)上的内容几乎完全是针对容器格式的,因此它们并没有完全映射到更一般的情况。如果我认为仅选择一个随机示例进行模拟就足够了,那么我就不会征求建议。
Sopoforic

@Sopoforic:然后,您需要清楚自己想要的内容。您是否在认真地问我们“我如何编写文件格式的文档?” 有专门针对该主题的完整的技术写作教育课程。找到一种格式清晰,写得很好的文档(根据您的个人标准),并加以模仿。他们不能都胡扯。 提示:用法示例为王。清晰的解释紧随其后。
罗伯特·哈维

1
@RobertHarvey:是的,就像关于如何注释代码或如何记录函数的问题一样,我正在寻找用于编写可理解格式规范的“样式指南”。如果我想知道如何编写RFC,可以看一下RFC2223。如果我想知道在Python代码中使用哪种样式,我可以阅读PEP 8。 ESR涵盖了我。关于文件格式规范,是否有一些类似的指导?还是一个著名的优秀例子?我当然可以使用自己的判断,但是如果存在一个标准,那么遵循它是明智的。
Sopoforic
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.