在设计文件格式时,您必须考虑各种因素,例如:
a) 文件是否有可能已损坏或被恶意篡改(或者是否有任何保密要求)?对此的答案几乎总是“是”。为了防止这些事情发生,您需要考虑某种校验和和/或加密。您可能还需要考虑是否需要部分恢复(例如,将文件拆分为多个块/部分是否有益,其中每个块都有自己的校验和/加密,这样如果一个块/部分中的 4 个字节损坏,您仍然可以恢复大部分数据)。
b) 是否存在可移植性问题?例如,如果您将原始double
值存储在文件中,是否会在其他具有不同二进制格式“”的计算机上产生问题double
?
c) 对于每种类型的值;实际需要表示的范围是多少,精度要求是多少?通常,软件使用比必要的“更大和更精确”(通常是因为它可以更快地选择 CPU 支持的下一个最大类型);但是对于文件格式,这会导致文件大小不必要的增加。举个简单的例子;也许您可以将(64 位)double
转换为 32 位定点格式并将使用的空间减半,同时仍能达到实际需要的范围和精度。
d) 是否有“聪明”的方法来减少某些值所需的范围和精度?举个简单的例子;也许你有“起始值”和“结束值”,它们都需要 64 位;但是您可以将其转换为“起始值”和“差异”(以便“结束值”可以计算为“起始值 + 差异”),其中“差异”值的范围较小,只需要 32 位来存储。
e) 任何类型的索引是否有益?举个简单的例子;如果文件可能包含 100 万个条目,而您只想找到一个,那么您可以使用索引来找到所需条目的偏移量,并且只加载该条目(并避免加载所有 100 万个条目)。
f) 你还想要什么其他元数据?这可以是“魔术签名”(以便软件可以检查文件是否应该符合文件格式并且用户没有给您的程序提供错误的文件类型),“文件格式版本号” (以便程序可以“自动更新到新的文件格式”或至少检测文件何时使用不再支持的过时/弃用的文件格式)。它还可以包括用于识别诸如作者是谁、数据来自何处、何时获取数据、哪个程序创建/准备文件等信息。有时还有可选数据和标志来说明是否可选数据是/不包含在文件中。您可能还需要诸如“条目数”和“每个不同区域的文件偏移量”之类的内容
g) 您需要为可扩展性(以及向后兼容性和向前兼容性)做出什么样的考虑?通常,人们会在标题中保留诸如(例如)“保留供将来使用”字段之类的内容,以便他们将来可以添加/更改/扩展文件格式而不会破坏所有内容。有时,这甚至更具体地说明当软件在它不支持的保留字段中看到值时应该做什么 - 例如“保留以供将来使用,应该为零,如果非零软件应该忽略这个值”与“保留”供将来使用,应为零,如果非零(由于将来使用)软件应生成错误并且不使用该文件“
h) 任何类型的压缩技术有用吗?举个简单的例子,如果你有“6 列,N 行”的索引,有时 2 行或更多行的数据恰好是相同的;那么也许您只能为这些行存储一份数据副本,然后使用索引来确定哪一行使用了哪些数据(有点像“ row[n] = unique_row_data[ index[n] ]
”)。