Метаданные декомпрессии 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). Это не имеет смысла для меня и, вероятно, неправильно.

Вот файл, который я пытался распаковать.

0 ответов

Другие вопросы по тегам