解析Microsoft复合文档时出现问题

时间:2010-09-12 16:11:09

标签: c++ ms-word .doc

我正在努力解决复合文档格式。

我目前正在使用C语言,但是在查找目录扇区方面存在问题。 我可以获得复杂的doc头,这是微不足道的,我知道找到扇区id(secid + 1 << sec_size)的文件偏移的公式,但每当我使用这个公式将secid转换为{{1对于我获得随机值的目录。

有人可以帮我理解我如何正确解决fileoffset补偿问题,也可以帮助我解决如何从复合文档中的扇区分配表中开发secid个链?

这是我尝试过的一个例子:

secid

<小时/> 编辑: comp_doc_header* cdh((comp_doc_header*)buffer); printf("cdoc header:%d\n", sizeof(cd_dir_entry)); if(cdh->rev_num == 0x003E)printf("rev match\n"); //check magic number if(cdh->comp_doc_id[0] != (unsigned char)0xD0 || cdh->comp_doc_id[1] != (unsigned char)0xCF || cdh->comp_doc_id[2] != (unsigned char)0x11 || cdh->comp_doc_id[3] != (unsigned char)0xE0 || cdh->comp_doc_id[4] != (unsigned char)0xA1 || cdh->comp_doc_id[5] != (unsigned char)0xB1 || cdh->comp_doc_id[6] != (unsigned char)0x1A || cdh->comp_doc_id[7] != (unsigned char)0xE1) return 0; buffer += 512; //here i try and get the first directory entry cd_dir_entry* cde((cd_dir_entry*)&buffer[(cdh->first_sector_id + 1) << 512]); 应为(secid + 1) * 512

1 个答案:

答案 0 :(得分:0)

这是C吗?我无法解析您的第一个或最后发布的行

cd_dir_entry* cde((cd_dir_entry*)&buffer[(cdh->first_sector_id + 1) << 512]);

您似乎将cde声明为返回指向cd_dir_entry的指针的函数;但是参数原型都是错误的...所以你调用函数并将结果乘以cd_dir_entry并立即忽略乘法的结果。


修改

我的简化尝试理解这一行

cd_dir_entry* cde(<cast>&buffer[(cdh->first_sector_id + 1) << 512]);
cd_dir_entry* cde(<cast>&buffer[<elem>]);
cd_dir_entry* cde(<parameter>);
/* this is either a function prototype */
/* or a multiplication with `cd_dir_entry` and the value returned from cde() */
/* in either case it does nothing (no side-effects present), */
/* unless cde messes with global variables */