*.docx 文件格式的结尾字节是什么

J R*_*nto 25 zip hard-drive data-recovery docx microsoft-word

我有一个已格式化并重新安装其操作系统的硬盘。

问题是,它在格式化之前没有启动,而且我在格式化之前所做的数据备份,出于某种原因,没有所有文件。
缺少 Microsoft Word *.docx 文件。

现在我正在尝试使用Puran File Recovery 恢复文件,但它没有预先内置的 *.docx 扩展名扫描条目。
Puran File Recovery 有一个选项可以让我们创建自定义条目,我在filesignatures.net 中找到了起始字节签名,所以现在我能够在硬盘中找到许多 *.docx 标头。

我现在的问题是我在任何地方都找不到*.docx 文件的结尾字节是什么,以便我可以恢复一些文件。

Del*_*tik 72

一个.docx文件只是一个.zip文件。这是 Zip 文件的结构:

Zip 文件的结构

Zip 文件的结尾由中央目录记录( EOCD )的结尾指示。EOCD 的长度是可变的,因为它可以包含长达 65535 字节的注释。请参阅下面的 EOCD 布局的粗体部分:

+---------+--------+------------------------------ ---------------------------------------+
| 偏移| 字节 | 说明 |
+---------+--------+------------------------------ ---------------------------------------+
| 0 | 4 | 中央目录签名结束 = 0x06054b50 |
| 4 | 2 | 此盘数 |
| 6 | 2 | 中央目录开始的磁盘|
| 8 | 2 | 此磁盘上的中央目录记录数 |
| 10 | 2 | 中央目录记录总数|
| 12 | 4 | 中央目录的大小(字节)|
| 16 | 4 | 中央目录开始的偏移量,相对于归档的开始|
| 20 | 2 | 评论长度 (n) |
| 22 | | | 评论 |
+---------+--------+------------------------------ ---------------------------------------+

来自维基百科的表格» Zip(文件格式) »中央目录记录结束 (EOCD)

您可以通过查找0x06054b50(EOCD 的开头)来获得 Zip 文件的结尾,然后在此之后计算 16 个字节。将接下来的两个字节设置0x0000为忽略注释,您现在应该拥有有效 Zip 文件的结尾。


注意:这不考虑文件系统碎片。如果.docx/.zip文件在磁盘上碎片化,您的恢复方法将不起作用,因为您找到的签名会被破坏。您需要文件系统中的一些信息才能将碎片文件拼凑在一起;开始和结束签名没有此信息。

PhotoRec是我以前用过的一个软件,它有一些技巧来弄清楚如何将碎片文件拼凑在一起。 对您来说至关重要的是,PhotoRec 内置了对 Zip 文件的支持,因此如果您当前的签名搜索策略不适合您,您可能想要尝试 TestDisk/PhotoRec。

  • PhotoRec 相当不错。可悲的是,有时,它只是随机吐出多个 GB 文件。 (4认同)

Nic*_*teo 12

Deltik 的回答是正确的。一些可能有用的信息:

End-Of-Central-Directory 标头的字节序列实际上将显示为 504b0506(反向顺序),如 xxd 等十六进制编辑器所见,或以字节寻址序列显示。

在有效的 OpenOfficeXML 文件(例如 .docx 文件)中,永远不会有中央目录结尾注释(请参阅ECMA-376,第 2 部分,第 76 页:不应生成“ZIP 文件注释”。但是,消费者无论如何都应该支持读取包含此类评论的文件。)

此外,不支持多磁盘归档(请参见第 75 页),因此“此磁盘的编号”字段和“中央目录开始的磁盘”字段始终为 0。此外,“此磁盘上的中央目录记录数”字段”和“中央目录记录总数”字段应该相等。

总而言之,任何 .docx 文件的最后 22 个字节应始终具有以下形式

 50 4b 05 06 00 00 00 00 ## ## ## ## ## ## ## ## ## ## ## ## 00 00
| signature |disk |CD-  |num. |num. |size of CD | CD offset |comment
|           |num. |disk |recs |recs |           |           |length
Run Code Online (Sandbox Code Playgroud)