在这种情况下提取未知存档文件的步骤是什么?
我看到文件名。这是一个非常重要的起点 - 如果我没有,我将不得不假设文件是加密、压缩的,或者根本不使用文件名,这些都更难解压。
目前,跳过标题“BigFile”和紧随其后的数据,只关注这些文件名。
如果文件名的长度不同,您可以验证这些记录是否是固定长度的记录(文件名被填充),或者具有不同的长度,在这种情况下,可能存在“长度”值 - 或没有。长度值可能不是必需的,文件名可以由特殊值终止,例如0.
还有其他值 - 通常,在存档格式中,这些是文件长度。也可以有一个文件偏移量——但从哪里来?(例如,文件的开头、不包括标题的存档数据的开头、实际数据的开头等。)如果所有文件都出现首尾相连,则不需要每个文件的偏移量,那么长度就足够了。
每个文件记录可能有额外的信息;我遇到过标志、文件类型代码、日期/时间戳、校验和等等。通常,在您发现最重要的位的含义后,其余数据也有意义。
要找出字节的含义,请编写一个小程序来打印每个文件名及其所有相关数据,直到下一个文件条目。不要费心尝试获得正确的“文件计数”。这很可能是开头标题中的数字之一;当您获得正确的文件列表详细信息时,您可以返回。对于初学者,只需写出前几十个条目的数据。
请记住,您无法立即判断文件名之前或之后是否有额外数据!或者两者兼而有之。
文件大小和偏移量通常是 4 个字节的数字;可以简单地检查字节顺序(所有小数字都很好,所有明显大的数字都必须是错误的)。类似但不同的数字可能是文件大小。不断增加的数字必须是绝对文件偏移量。总是在某些二进制位置包含数据而在其他位置不包含数据的数字可以是某种类型的标志。徘徊在相似值附近的大值很可能是时间戳。最后,看起来随机的完整 4 字节数字可能是校验和。
如果在解码文件记录测试集的数据时获得一致的良好结果,请通过反复试验找到列表的开头和结尾。在这里,您可能会发现记录的“结束”实际上是下一个记录的开始。
这将告诉您 (1) 记录数,以及 (2) 记录数据的开始。您可以检查这些数字是否出现在“BigFile”标题中 - 特别是记录数会很有用。
如果您可以找到“看起来”可能是文件长度和(可选)偏移量的数字,您可以编写一个测试程序来提取单个文件。这也可能有助于确定数据的顺序;如果您提取的文件显然是 PNG 图像,但其关联的文件名是“config.txt”,则说明您的顺序有误。
上述的替代方案是首先关注数据。某些文件类型,例如 PNG 图像,应该是完全自包含的:如果您找到 PNG 图像的开头,您可以通过查找指示IEND标记立即完整地提取它。然后您就有了可靠的文件长度,因此您可以在文件记录集中搜索匹配项。
