复合文档学习笔记(五)

两个流

原创:弄潮小狮

复合文档本身有两个流,表述了复合文档的相关信息,这就是“<05H>SummaryInformation”(与文件类型无关)和“<05H>DocumentSummaryInformation”(与文件类型有关)。

这两个流在英文原文里面没有做进一步介绍,网上资料也非常有限。因此,本篇专门介绍这两个流。

在Windows下面,右击一个Office文件(Word、Excel、PPT或其他),从弹出菜单选择“属性”,查看属性窗口的“摘要”选项页,如图8:

图片[1]-复合文档学习笔记(五)-吾爱博客

图8(操作系统截图)

可以查看文件的有关摘要信息,这些信息就存放在复合文档的“<05H>SummaryInformation”流中。

事实上,不管你的系统是否安装Office,或者你查看的文件是否具备正确的扩展名(即文件名后缀,如:“.xls”),只要查看的文件是一个正确的复合文档,只要你的操作系统是Windows(未考证过版本限制,xp以上的版本就没问题)就可以查看到该信息(图8显示的是一个Excel文件,其他文件有些差别)。

这就说明,微软的操作系统本身直接支持复合文档的文件格式,而不管该复合文档作何用途。

示例文件中“<05H>SummaryInformation”流的数据见图9:

图片[2]-复合文档学习笔记(五)-吾爱博客

图9

“<05H>SummaryInformation”流的格式:

0(00h)至27(1Bh)共28个字节,是“<05H>SummaryInformation”流的头部,在头部中:

0(00h)至1(01h)共2个字节,是一个16位整数,表示字节排序方式。这个在《复合文档学习笔记(二)》中已经讲过,不再赘述。

2(02h)至3(03h)共2个字节,是一个16位整数,用于流验证。事实上,我不清楚这个字段是做什么用的,这个值总是0.

4(04h)至5(05h)共2个字节,表示操作系统的版本号,前一个字节表示主版本号,后一个字节表示次版本号。对于Windows xp,这两个字节的值为“05 01”。

6(06h)至7(07h)共2个字节,是一个16位整数,表示操作系统,取值可以是:2(Win32)、1(Mac)或0 (Win16)。

8(08h)至23(17h)共16个字节,是一个流的类编码(the stream’s class id),格式为“dword + 2 words + 2 bytes + 6 bytes”(dword为32位整数、word为16位整数、byte为8位整数),值为“00000000-0000-0000-0000-000000000000”。

24(18h)至27(1Bh)共4个字节,是一个32位整数,表示流中节(section)的个数,通常“<05H>SummaryInformation”流只有1节,该值总是1。

紧接着头部的是节声明,共20个字节,2个字段:

28(1Ch)至43(2Bh)共16个字节,是一个节的类编码(section’s class id),对于“<05H>SummaryInformation”流,该值为“f29f85e0-4ff9-1068-ab91-08002b27b3d9”。

44(2Ch)至47(2F)共4个字节,是一个32位整数,表示节数据相对于流起始位置的偏移量。值通常为48(30h)。

节头部,在示例中,节的偏移量为48(30h),节头部共8个字节,有2个字段,在节中:

0(00h)至3(03h)(示例中,对应流偏移量为48(30h)至51(33h),下同)共4个字节,是一个32位整数,表示节尺寸。

24(18h)至27(1Bh)共4个字节,是一个32位整数,表示属性个数。

紧接着节头部,是若干(按属性个数,示例中为8个)个属性声明,属性声明由两个32位整数构成,前者为属性编码(ID),后者为属性数据相对于节起始位置的偏移量。

对于“<05H>SummaryInformation”流,属性编码(ID)及其含义如下:

 

属性编码(ID) 含义 属性类型
1(01h) 代码页 2(02h)
2(02h) 标题 30(1Eh)
3(03h) 主题 30(1Eh)
4(04h) 作者 30(1Eh)
5(05h) 关键字 30(1Eh)
6(06h) 备注 30(1Eh)
7(07h) 模板 30(1Eh)
8(08h) 最后保存 30(1Eh)
9(09h) 修正号 30(1Eh)
10(0Ah) 总编辑时间 64(40h)
11(0Bh) 最后打印时间 64(40h)
12(0Ch) 创建时间 64(40h)
13(0Dh) 最后保存时间 64(40h)
14(0Eh) 页数 3(03h)
15(0Fh) 字数 3(03h)
16(10h) 字符数 3(03h)
17(11h) 缩略图 71(47h)
18(12h) 创建文档的程序名称 30(1Eh)
19(13h) 安全 3(03h)

 

属性数据的长度不是固定的,它跟属性类型有关,属性数据的第一个32位整数表示属性类型,紧接其后的就是属性的值,属性类型及其含义如下:

 

属性类型 含义
2(02h) 16位带符号整数
3(03h) 32位带符号整数
19(13h) 32位无符号整数
30(1Eh) 字符串(格式:32位整数表示长度+0结尾的字符串)
64(40h) 时间戳
71(47h) 剪贴板格式

 

 打开一个Office文件(Word或者Excel等),从菜单项“文件|属性”可以打开如图10所示的属性窗口:

图片[3]-复合文档学习笔记(五)-吾爱博客

图10(Excel截图)

 这些属性就储存于“<05H>DocumentSummaryInformation”流中,其结构与“<05H>SummaryInformation”流类似,所不同的是节的类编码(section’s class id)的值为“d5cdd502-2e9c-101b-9397-08002b2cf9ae”。

“<05H>DocumentSummaryInformation”流中主要储存与文件类型有关的属性,因此,根据不同类型的文件,在属性编码及属性类型上做了一些扩展,这里就不再一一介绍了。

另外,图8中有一个“公司”的属性,也储存于“<05H>DocumentSummaryInformation”流中,属性编码(ID)为15(0Fh),属性类型为30(1Eh)。因此,在操作系统中查看一个没有扩展名的复合文档的属性,是没有该项属性的。

很长时间没有写过技术类的文章了,越写越累!

全文完。

 

另:本文发表以来,常有网友留言索要“复合文档查看器”,现有网友提供空间/,有需要的可直接下载。

声明:本工具仅为方便学习而编写,本身不是很稳定,也常报错。也请勿用于商业用途。

温馨提示: 本文最后更新于2018-09-27,至今已有2009天,某些文章具有时效性,若有错误或已失效,请在下方留言
© 版权声明
THE END
喜欢就支持一下吧❀
点赞0投币 分享
评论 抢沙发

    请登录后查看评论内容