两个流
原创:弄潮小狮
复合文档本身有两个流,表述了复合文档的相关信息,这就是“<05H>SummaryInformation”(与文件类型无关)和“<05H>DocumentSummaryInformati
这两个流在英文原文里面没有做进一步介绍,网上资料也非常有限。因此,本篇专门介绍这两个流。
在Windows下面,右击一个Office文件(Word、Excel、PPT或其他),从弹出菜单选择“属性”,查看属性窗口的“摘要”选项页,如图8:
图8(操作系统截图)
可以查看文件的有关摘要信息,这些信息就存放在复合文档的“<05H>SummaryInformation”流中。
事实上,不管你的系统是否安装Office,或者你查看的文件是否具备正确的扩展名(即文件名后缀,如:“.xls”),只要查看的文件是一个正确的复合文档,只要你的操作系统是Windows(未考证过版本限制,xp以上的版本就没问题)就可以查看到该信息(图8显示的是一个Excel文件,其他文件有些差别)。
这就说明,微软的操作系统本身直接支持复合文档的文件格式,而不管该复合文档作何用途。
示例文件中“<05H>SummaryInformation”流的数据见图9:
图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) | 剪贴板格式 |
图10(Excel截图)
“<05H>DocumentSummaryInformati
另外,图8中有一个“公司”的属性,也储存于“<05H>DocumentSummaryInformati
很长时间没有写过技术类的文章了,越写越累!
全文完。
另:本文发表以来,常有网友留言索要“复合文档查看器”,现有网友提供空间/,有需要的可直接下载。
声明:本工具仅为方便学习而编写,本身不是很稳定,也常报错。也请勿用于商业用途。
请登录后查看评论内容