Метаданные декомпрессии MS-XCA указывают вне сжатого байтового массива
Мне нужно распаковать файл модели данных, встроенный в файл 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/
Теперь 3-й кусок, где я заблудился
w±engine":ddl27/"/2G_W?%g100gO8eðg_‡_)§è.Õ®]›‡o
Я не уверен, где именно заканчивается чанк, потому что когда я начал подсчитывать каждые 36 байтов после тех первых, через некоторое время я достигал части потока байтов, которая должна быть распакована и не выстроилась в очередь.
Итак, вернемся к третьему куску. Битовая маска для этого 0x77 0xB1 0x04 0x01.
Или в двоичном виде 01110111 10110001 00000100 00000001. Я попытался выровнять это с байтами, и это не имело никакого смысла. Ясно, что слово "несжатый" и подходит для предыдущих блоков, потому что быстрый поиск в Google показал мне результат с пространством имен " 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). Это не имеет смысла для меня и, вероятно, неправильно.
Вот файл, который я пытался распаковать.