MS-DOC 文件格式概述

Microsoft Office Word 2003、Microsoft Word 2002、Microsoft Word 2000 和 Microsoft Word 97 都使用 MS DOC 二进制文件格式作为其默认文件格式。这种文件格式适用于任何具有 .doc 或 .dot 扩展名的文件。 Word 文档中的基本数据单位是字符,它可能包括格式字符和其他不可见字符,以及 ANSI 和 Unicode 字符。所有字符数据都驻留在 Word 文档流 中。该流的开头是一个称为文件信息块 (FIB) 的结构,其中包含指向文件中所有数据的指针。

注释:

在 Microsoft Word 中执行大多数编程任务的推荐方法是使用 Word 主互操作程序集 (该链接可能指向英文页面)。这些程序集是一组提供可用于 Microsoft Word 的完整对象模型的 .NET 类。本系列文章只涉及高级场景,如未安装 Microsoft Word 的场景。

MS-DOC 文件格式的重要组件

以下是在处理 .doc 文件时必须了解的一些最重要的结构。

  • 2.1.1 WordDocument Stream

    Word 文档流是 .doc 文件中的主要流,其中包含文件中的所有数据(表格除外,表格存储在 1Table stream or 0Table stream中)。

    • File Information Block

      文件信息块从 Word 文档流的偏移 0x00 开始。它指定文件中所有其他数据的位置。位置由一对整数指定,第一个整数指定位置,第二个整数指定大小。这些整数出现在文件信息块的子结构中,如 FibRgFcLcb97。位置名称带有前缀 fc。大小名称带有前缀 lcb。

    • Clx 结构

      Clx 结构是由零个或多个 Prc 结构组成的包含属性信息的数组,后跟一个 Pcdt 结构,该结构又包含一个 PlcPcd 结构。

  • Character

    字符可以是文本字符或非文本字符(如段落标记或对象锚点)。其大小可能因它是 ANSII、Unicode 还是控制字符而异。文档中的相邻字符在二进制文件中不一定相邻。

    • Character Position (CP)

      字符位置 (CP) 是一个无符号的 32 位整数,它给出字符在文档文本中的索引位置。

    • Pcd 结构

      Pcd 结构指定文本在 Word 文档流中的位置,同时指定文本的一些属性。

  • Plc

    PLC 结构是一个 CP 数组,后跟一个数据元素数组。不同的 Plc 结构具有不同的名称和功能,例如 Plcbkf 结构,它由书签和指向书签的指针组成。

  • PlcPcd 结构

    PlcPcd 结构是一个 PLC 结构,它将一个 CP 数组映射到 Pcd 结构。换言之,它将流中的字符位置映射到文档文本中的字符。

从 Word 文件提取文本

用于检索文本的正式算法在 MSDN 上开放规范文档中的 2.4.1 Retrieving Text下发布,并且在“示例”部分的 3.1 Example of a Clx下给出了一个介绍部分过程的示例。以下是该过程的简化版本。

从 Word 文档提取文本

  1. 将 .doc 文件读入数据流。

  2. 开始在 Word 文档流的偏移 0 处读取文件信息块 (FIB)。有关详细信息,请参阅 2.5.15 How to read the FIB

  3. 在文件信息块内,找到 FibRgFcLcb97 结构。此结构从 FIB 的第 154 个字节开始。它由一系列的 4 字节字段组成。

  4. 在第 268 个字节处读取 FibRgFcLcb97.fcClx 字段,在第 272 个字节处读取 FibRgFcLcb97.lcbClx 字段。这些字段指定 Clx 的偏移位置和大小。

  5. 在 FibRgFcLcb97.fcClx 字段指定的偏移处开始从表格流中读取 Clx 结构。

  6. Clx 结构内,找到 Pcdt,其后紧跟可变长度的 Prc 结构的 .RgPrc 数组

    对于数组中的每个成员:

    1. 读取 .clxt 属性,该属性是 Prc 结构的 0 字节。如果 .clxt = 0x02,表明您已找到 Pcdt。

    2. 如果 .clxt = 0x01,读取后面 2 个字节作为有符号整数,然后跳过该数量的字节来到数组的下一成员。

  7. Pcdt 结构内,找到 PlcPcd 结构,该结构从 Pcdt 的第 5 个字节开始。

  8. 加载 PlcPcd.aPcd 数组和 PlcPcd.aCp 数组。这些数组的成员通过索引值彼此对应。

  9. 对于 PlcPcd.aPcd 中的每个 Pcd 结构:

    1. 在当前 Pcd 结构的第 46 位处读取 Pcd.Fc.fCompressed 字段的值。如果为 0,则 Pcd 结构指代一个 16 位的 Unicode 字符。如果为 1,则指代一个 8 位的 ANSI 字符。

    2. 读取 Pcd.Fc 的值(当前 Pcd 的第 2-5 个字节)以及相应的 CP 值。

      • 如果是 Unicode,则位于当前 CP 值所指定的字符位置处的文本的起始偏移量等于在 Word 文档流中的 Pcd.Fc 值,且每个字符占两个字节。
      • 如果是 ANSI,则位于当前 CP 处的文本开始于 Pcd.Fc 值的一半的偏移量处,且每个字符占一个字节。

      在任一种情况下,当前 CP 指定的字符数都等于数组中下一个 CP 的值减去当前 CP 的值。

结论

本文只是 MS-DOC 格式的一个样本。借助本文提供的工具,您可以进行简单的数据恢复。经过进一步研究后,您可以开始恢复格式信息和其他元数据,并最终执行“保存”操作。

MS-DOC 文件格式概述相关推荐

  1. python word 操作 doc 文件格式转docx 格式 学习笔记

    python word 操作 doc 文件格式转docx 格式 学习笔记 from win32com import client as wc import time # TODO file_0 = & ...

  2. java阅读doc文件格式_java – 正确区分.xls和.doc文件的方法?

    .doc / .xls文档都可以以OLE2存储格式存储. org.apache.poi.poifs.filesystem.FileMagic可以帮助您仅检测文件存储格式,而不仅仅是为了区分.doc / ...

  3. elasticsearch index doc过程概述

    文章目录 概述 1.es中的基础概念 2.es中的索引过程 2.1 一次index请求的大体流程 2.2 为什么是near real time 2.3 为什么要有translog 2.3.1 tran ...

  4. tablesample oracle,Hive DDL 内部表外部表 分区 分桶 行格式 存储文件格式 概述

    创建数据库 CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] ...

  5. android ts格式,MPEG2TS文件格式概述

    总结TS文件格式,早在几个月前就有了这个想法,但一直拖到今天才真正准备写一篇博文来介绍. 再不介绍的话,估计几月后又要去故纸堆里翻东西了,毕竟个人笔记中总结记录的东西太多,搞不好哪天给意外弄丢了. 1 ...

  6. lucene .doc文件格式解析——见图

    摘自:http://forfuture1978.iteye.com/blog/546841 4.2.2. 文档号及词频(frq)信息 文档号及词频文件里面保存的是倒排表,是以跳跃表形式存在的. 此文件 ...

  7. 【转】分析现行的常用的文件格式类别

    摘要:讲述现今常见的在特定领域有代表性的文件格式,并没有深入讲述每种格式的存储状态(方式),只对相应格式的特性优缺点做简要概述.   关键字:计算机,文件格式,图形,图像,音频,视频,流媒体,手机铃声 ...

  8. linux ELF文件格式分析

    一.ELF文件格式概述 1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西.以及都以什么样的格式去放这些东西. 二.分析一个ELF文件 以一个最简单的helloworld程 ...

  9. JPEG文件格式简单分析

    本文选自 http://www.blogjava.net/wilsonny/archive/2005/07/01/7000.aspx 摘要: 这篇文章大体上介绍了JPEG文件的结构信息以及它的压缩算法 ...

最新文章

  1. 导致网速变慢的安全隐患
  2. react 禁止微信调整字体大小
  3. sql server 用户'sa'登录失败(错误18456)
  4. Cors 跨域Access-Control-Allow-Origin
  5. 酱油和gbt酱油哪个好_都说日本的酿造酱油品质好,我国的酱油究竟差在哪儿?...
  6. Linux关机命令和重启命令
  7. SAP Commerce Cloud 项目 Spartacus 入门
  8. iOS 学习之NSPredicate
  9. 广州大学计算机网络期末考试2013,广州大学计算机网络技术试卷(A卷)
  10. Centos 7初始化脚本
  11. php命令行(cli)下相对路径的问题
  12. free命令查看内存信息
  13. 崩溃死我的Dev无法调试,Devc调试点下一步没反应
  14. C语言程序设计——学生学籍管理系统
  15. 逆向分析CRACKME 第一章 Acid burn
  16. mysql数据库备份方法有几种_MySQL数据库备份的几种方式
  17. 龙芯cpu 3A3000搭建electron运行环境
  18. 【hadoop生态之Hive】Hive的基本概念和安装【笔记+代码】
  19. 关于大成资源网这一个月大成网停更详细原因
  20. 阿里蚂蚁金服4面面经(已拿Offer)附答案!突如其来的意外之喜

热门文章

  1. JDK异常处理No appropriate protocol
  2. 纳人才,谋发展 | 人大金仓喜获“最佳雇主校招案例奖”
  3. php对接一网通,Android招行一网通对接
  4. python中复数的实部和虚部都是浮点数_Python学习笔记:从入门到放弃(2)基本语法...
  5. 常用软胶材料基本知识
  6. 解决android手机EditText设置光标颜色,android:textCursorDrawable=@drawable/corner_cursor 华为手机无效果的问题
  7. 如何将音乐复制到您的Android手机
  8. MAC或linux上使用MODIS投影镶嵌工具MRT-客户端
  9. 用python写一个PDF翻译软件
  10. 王者荣耀8月6日服务器维护,8月6日体验服停机更新公告