Qt4: декомпиляция файла ресурсов rcc

Некоторое время ковырял файл ресурсов, получаемого с помощью компилятора ресурсов rcc (Qt4). При помощи исходников компилятора удалось восстановил для себя структуру файла, может быть кому-то понадобится.



Заголовок файла содержит 4 байта ключа 'qres', какое-то число (версия?) и смещения на сегменты данных data_blobs, имён data_names и структуры data_struct:


// Qt4 RCC file struct

struct RCC_SIGNATURE { /* 12 bytes total */
Char[4] 'qres'
double version?;
double offset_segment_data_struct;
double offset_segment_data_blobs;
double offset_segment_data_names;
}

Сегменты идут подряд, ссылки на начало сегмента абсолютные от начала файла.
В сегменте data_structure каждая запись длиной 14 байт и содержит в себе dword относительное смещение на имя файла в сегменте имён (data_names) и флаги (is_directory или is_compressed). Если элемент является директорией ,- указано количество элементов в папке и смещение на первый вложенный элемент (child), если обычный,- вместо количества элементов стоят признаки локали(страны) и языка элемента (word+word), за которыми следует смещение на данные элемента.


struct RCC_ITEM_DIRECTORY { /* 14 byte's total */
double name_offset;
word flags;
double children_size;
double children_offset;
}

struct RCC_ITEM_FILE { /* 14 byte's total */
double name_offset;
word flags;
word country_code;
word locale_language;
double data_offset;
}


В сегменте имён первые 2 байта,- длина соответствующего элемента в байтах, начиная со следующего байта.

В сегменте data_blobs'ов аналогично,- первое слово,- длина содержимого, за которым следует содержимое. Содержимое может быть упаковано (на это указывает флаг is_compressed в сегменте data_structure), в таком случае после 2-х байт длины ещё 2-байта,- предполагаемая длина распакованного содержимого, остальное,- сжатое с помощью zlib содержимое файла.