了解二进制xls文件格式

我试图读取一个xls文件的内容,而不使用任何xls库,但有问题。

我正在尝试使用我在这里find的信息 。 它有一个如何读取文件的一步一步的指令。 也使用这个xls文件规范 。

我不确定是否我甚至正确地做了这一步:

3,打开工作簿stream并扫描BOFlogging的第一个实例。 这是Globals子stream的开始。

根据文件规范或这个页面的logging号码列表 ,我应该寻找2057(0809h),但整个文件不包含任何地方的logging(也试图find时使用六编辑器它)。 但后来我在规范的第20页上阅读了这个部分:

字节交换Excel BIFF文件可通过MS-DOS / Windows和Apple Macintosh操作系统进行传输。 为了支持可移植性,Excel写入BIFF文件,其中字的低位字节首先出现在文件中,然后是高位字节。

如果我正确地理解了(不确定我是否这样做)这个词的大端,那么我所要找的就是2312(0908h)。 这使我觉得正确的印象,因为它是在我尝试的每个文件中很早就发现的。

那么到下一步:

4,阅读Globals子stream,将BoundSheet8logging和SST加载到内存中。 有关更多详细信息,请参阅全局。

我查找了133(8500小时),它在转炉后不久就被发现了。 但问题在于接下来的两个步骤:

5,从与您要打开的子stream相对应的BoundSheet8logging中,读取包含lbPlyPos FilePointer的前4个字节。 6,转到由lbPlyPos FilePointer指定的stream中的偏移量。 这是工作表的BOFlogging。

所以下面的4个字节是指向我应该去的文件中的一个位置的指针。 但是,以任何顺序读取这些字节给了我一个大于整个文件的数字。 还有,这部分让我感到困惑:“这是工作表的BOFlogging”。 那不是我在前一步发现的吗? 嗯…

对不起,我散漫。 我希望我有道理,有人愿意帮助我一点。

更新:好的,我已经进一步了。 这对我来说是相当困惑的,但是似乎每个logging也被认为是“大端”,即logging中的最后一个variables是文件中最早定位的那个variables。 虽然我不知道它是否适用于可变长度的值? 所以,看这个 ,可变长度的值被列为logging中的最后一个。 但显然他们不能作为文件中的第一个,因为如果这个信息出现之后就没有办法知道要读取多less个字节? 无论如何,如果我忽略这个值,并跳过2个字节的DT和A /未使用,并阅读下面的4个字节作为一个uint它结果为1130在我的情况。 把这个加到第一个BOF的位置,给了我BOF的确切位置。 那不是巧合吧?

现在下一个问题出现了。 之后,BOFlogging索引logging应该立即进行。 但不pipe以什么方式读取字节,它仍然没有意义…下面是它的样子:

09 08 10 00 00 06 10 00 BB 0D CC 07 00 00 00 00 06 00 00 00 00 02 0E 00 00 00 00 00 1E 00 00 00 00 00 12 00 00 00 3E 02 12 00 B6 06 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 7D 00 0C 00 00 00 00 00 DD 06 0F 00 00 00 00 00 7D 00 0C 00 02 00 02 00 DD 06 0F 00 00 00 00 00 7D 00 0C 00 04 00 04 etc …

前2个字节存在BOFlogging09 08或0809交换,即2057(代表BOF),所以剩下的应该是INDEX,但没有意义…我将不胜感激,如果有人可以帮助我这个。

关于BOFlogging,我可以告诉你,它指的是文件的开始,并在每个子stream的开始,Excel文件包含。 鉴于您通常有3个工作表,所有工作表都有VBA代码表,工作簿有一个代码表,您正在查看8个BOFlogging。

BOFlogging不只是前两个字节。 接下来的两个字节“10 00”告诉你logging其余部分的长度(这意味着0x0010或16字节)。 但是,在向前计数16个字节之后,那里没有索引logging。 (从loggingID列表中 ,索引logging的ID应该是523,即0x020b,它将显示为“0b 02”。)

你一定在看错误的BOF。 您必须找不到lbPlyPos指针或不正确的跟随它。

所以下面的4个字节是指向我应该去的文件中的一个位置的指针。 但是,以任何顺序读取这些字节给了我一个大于整个文件的数字

确保你跳过两个字节给你的logging的大小。