MS-DOC 文件格式概述
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 结构。
- File Information Block
- Character
字符可以是文本字符或非文本字符(如段落标记或对象锚点)。其大小可能因它是 ANSII、Unicode 还是控制字符而异。文档中的相邻字符在二进制文件中不一定相邻。
- Character Position (CP)
字符位置 (CP) 是一个无符号的 32 位整数,它给出字符在文档文本中的索引位置。
- Pcd 结构
Pcd 结构指定文本在 Word 文档流中的位置,同时指定文本的一些属性。
- Character Position (CP)
- Plc
PLC 结构是一个 CP 数组,后跟一个数据元素数组。不同的 Plc 结构具有不同的名称和功能,例如 Plcbkf 结构,它由书签和指向书签的指针组成。
- PlcPcd 结构
PlcPcd 结构是一个 PLC 结构,它将一个 CP 数组映射到 Pcd 结构。换言之,它将流中的字符位置映射到文档文本中的字符。
从 Word 文件提取文本
用于检索文本的正式算法在 MSDN 上开放规范文档中的 2.4.1 Retrieving Text下发布,并且在“示例”部分的 3.1 Example of a Clx下给出了一个介绍部分过程的示例。以下是该过程的简化版本。
从 Word 文档提取文本
将 .doc 文件读入数据流。
开始在 Word 文档流的偏移 0 处读取文件信息块 (FIB)。有关详细信息,请参阅 2.5.15 How to read the FIB
在文件信息块内,找到 FibRgFcLcb97 结构。此结构从 FIB 的第 154 个字节开始。它由一系列的 4 字节字段组成。
在第 268 个字节处读取 FibRgFcLcb97.fcClx 字段,在第 272 个字节处读取 FibRgFcLcb97.lcbClx 字段。这些字段指定 Clx 的偏移位置和大小。
在 FibRgFcLcb97.fcClx 字段指定的偏移处开始从表格流中读取 Clx 结构。
在 Clx 结构内,找到 Pcdt,其后紧跟可变长度的 Prc 结构的 .RgPrc 数组
对于数组中的每个成员:
读取 .clxt 属性,该属性是 Prc 结构的 0 字节。如果 .clxt = 0x02,表明您已找到 Pcdt。
如果 .clxt = 0x01,读取后面 2 个字节作为有符号整数,然后跳过该数量的字节来到数组的下一成员。
在 Pcdt 结构内,找到 PlcPcd 结构,该结构从 Pcdt 的第 5 个字节开始。
加载 PlcPcd.aPcd 数组和 PlcPcd.aCp 数组。这些数组的成员通过索引值彼此对应。
对于 PlcPcd.aPcd 中的每个 Pcd 结构:
在当前 Pcd 结构的第 46 位处读取 Pcd.Fc.fCompressed 字段的值。如果为 0,则 Pcd 结构指代一个 16 位的 Unicode 字符。如果为 1,则指代一个 8 位的 ANSI 字符。
读取 Pcd.Fc 的值(当前 Pcd 的第 2-5 个字节)以及相应的 CP 值。
- 如果是 Unicode,则位于当前 CP 值所指定的字符位置处的文本的起始偏移量等于在 Word 文档流中的 Pcd.Fc 值,且每个字符占两个字节。
- 如果是 ANSI,则位于当前 CP 处的文本开始于 Pcd.Fc 值的一半的偏移量处,且每个字符占一个字节。
在任一种情况下,当前 CP 指定的字符数都等于数组中下一个 CP 的值减去当前 CP 的值。
结论
本文只是 MS-DOC 格式的一个样本。借助本文提供的工具,您可以进行简单的数据恢复。经过进一步研究后,您可以开始恢复格式信息和其他元数据,并最终执行“保存”操作。
MS-DOC 文件格式概述相关推荐
- python word 操作 doc 文件格式转docx 格式 学习笔记
python word 操作 doc 文件格式转docx 格式 学习笔记 from win32com import client as wc import time # TODO file_0 = & ...
- java阅读doc文件格式_java – 正确区分.xls和.doc文件的方法?
.doc / .xls文档都可以以OLE2存储格式存储. org.apache.poi.poifs.filesystem.FileMagic可以帮助您仅检测文件存储格式,而不仅仅是为了区分.doc / ...
- elasticsearch index doc过程概述
文章目录 概述 1.es中的基础概念 2.es中的索引过程 2.1 一次index请求的大体流程 2.2 为什么是near real time 2.3 为什么要有translog 2.3.1 tran ...
- tablesample oracle,Hive DDL 内部表外部表 分区 分桶 行格式 存储文件格式 概述
创建数据库 CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] ...
- android ts格式,MPEG2TS文件格式概述
总结TS文件格式,早在几个月前就有了这个想法,但一直拖到今天才真正准备写一篇博文来介绍. 再不介绍的话,估计几月后又要去故纸堆里翻东西了,毕竟个人笔记中总结记录的东西太多,搞不好哪天给意外弄丢了. 1 ...
- lucene .doc文件格式解析——见图
摘自:http://forfuture1978.iteye.com/blog/546841 4.2.2. 文档号及词频(frq)信息 文档号及词频文件里面保存的是倒排表,是以跳跃表形式存在的. 此文件 ...
- 【转】分析现行的常用的文件格式类别
摘要:讲述现今常见的在特定领域有代表性的文件格式,并没有深入讲述每种格式的存储状态(方式),只对相应格式的特性优缺点做简要概述. 关键字:计算机,文件格式,图形,图像,音频,视频,流媒体,手机铃声 ...
- linux ELF文件格式分析
一.ELF文件格式概述 1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西.以及都以什么样的格式去放这些东西. 二.分析一个ELF文件 以一个最简单的helloworld程 ...
- JPEG文件格式简单分析
本文选自 http://www.blogjava.net/wilsonny/archive/2005/07/01/7000.aspx 摘要: 这篇文章大体上介绍了JPEG文件的结构信息以及它的压缩算法 ...
最新文章
- 导致网速变慢的安全隐患
- react 禁止微信调整字体大小
- sql server 用户'sa'登录失败(错误18456)
- Cors 跨域Access-Control-Allow-Origin
- 酱油和gbt酱油哪个好_都说日本的酿造酱油品质好,我国的酱油究竟差在哪儿?...
- Linux关机命令和重启命令
- SAP Commerce Cloud 项目 Spartacus 入门
- iOS 学习之NSPredicate
- 广州大学计算机网络期末考试2013,广州大学计算机网络技术试卷(A卷)
- Centos 7初始化脚本
- php命令行(cli)下相对路径的问题
- free命令查看内存信息
- 崩溃死我的Dev无法调试,Devc调试点下一步没反应
- C语言程序设计——学生学籍管理系统
- 逆向分析CRACKME 第一章 Acid burn
- mysql数据库备份方法有几种_MySQL数据库备份的几种方式
- 龙芯cpu 3A3000搭建electron运行环境
- 【hadoop生态之Hive】Hive的基本概念和安装【笔记+代码】
- 关于大成资源网这一个月大成网停更详细原因
- 阿里蚂蚁金服4面面经(已拿Offer)附答案!突如其来的意外之喜
热门文章
- JDK异常处理No appropriate protocol
- 纳人才,谋发展 | 人大金仓喜获“最佳雇主校招案例奖”
- php对接一网通,Android招行一网通对接
- python中复数的实部和虚部都是浮点数_Python学习笔记:从入门到放弃(2)基本语法...
- 常用软胶材料基本知识
- 解决android手机EditText设置光标颜色,android:textCursorDrawable=@drawable/corner_cursor 华为手机无效果的问题
- 如何将音乐复制到您的Android手机
- MAC或linux上使用MODIS投影镶嵌工具MRT-客户端
- 用python写一个PDF翻译软件
- 王者荣耀8月6日服务器维护,8月6日体验服停机更新公告