我需要解压缩嵌入在 xlsx 文件中的数据模型文件。该文件应该使用 MS-XLDM 文件格式,应该由 3 个部分(电子表格数据模型头、文件和虚拟目录)组成,只有中间一个被压缩。第一个和最后一个部分是 xml 与 unicode/utf-16 编码大概(每隔一个字节是 0x00 并且内容前面是 0xFF 和 0xFE )。中间文件前面是一小块 xml。有关文件结构的更多详细信息。
现在根据文档,应该使用此处指定的 Xpress 压缩来压缩文件,该压缩使用 LZ77 压缩和 DIRECT2 编码。
现在进入正题。据我了解,应该总是有一个 4 字节的位掩码,指示相应位置的字节是否应该是 1:1 数据或元数据。
例如,给定一个假设的 8 位位掩码,字符串“ABCABCDEF”被压缩为 (0,0)A(0,0)B(0,0)C(3,3)D(0,0)E( 0,0)F。它的位掩码是 b'00010001' (0x11)。
如果给定位置应该是元数据,则至少应读取 2 个字节。在 16 位中,前 13 位是偏移量,后 3 位是长度(除非最后一位是 1,否则必须读取另一个字节)。
所以现在到我挣扎的具体例子。前 2 块很容易。
第一个是:
....<Load xmlns="http://schemas.micr
前 4 个字节(点)是 0x00,因此后面的 32 个字节是未压缩的。下一个块是相似的:
....osoft.com/analysisservices/2003/
现在第三块是我迷路的地方
w±engine":ddl27/"/2G_W?%g100gO8eðg_‡_)§è.Õ®]›‡o
我不确定该块到底在哪里结束,因为当我开始在第一个字节之后每 36 个字节计数一次时,我会到达应该未压缩的字节流的一部分并且它没有对齐。
所以回到第三块。这个的位掩码是0x77 0xB1 0x04 0x01。
或二进制01110111 10110001 00000100 00000001。我试图将它与字节对齐,但这没有任何意义。显然“引擎”这个词是未压缩的,它适合前面的块,因为快速的谷歌搜索向我显示了一个带有命名空间“ http://schemas.microsoft.com/analysisservices/2003/engine ”的结果。
01110111 10110001 00000100 00000001
engine" :ddl27 /"/2G_W ?%g100gO8eðg_‡_)
这让我觉得如果位掩码是相反的顺序,可能是字节。这对我来说更有意义。
00000001
engine"
如果这是真的,那么元数据应该是0x0B 0x02。
或二进制00001011 00000010。因此,如果我将其拆分,前 13 位构成元数据的偏移量。长度为 010 +恒定偏移量3 = 2+3=5。
Before 0000101100000
Invert 1111010011111
Decimal -353
但是向后看 353 个字节,它位于未压缩的分区 xml 部分,应该返回括号中的字符(ame)。这对我来说没有意义,而且可能是错误的。
这是我尝试解压缩的文件。