Формат Sims3Pack и его декодирование: Часть теоретическая
Автор: AnriRS
Статьи по теме
- библиотека компонентов для работы с файлами TS3 – Sims3Pack: типы данных, на русском языке;
- библиотека компонентов для работы с файлами TS3 – Sims3Pack: реализация декодера, на русском языке;
- описание формата Sims3: Sims3Pack, на английском языке;
Файл Sims3Pack хранит файлы и состоит из трех частей:
- заголовка файла;
- манифеста XML;
- секции данных;
Заголовок данных
Заголовок данных имеет размер 17 байт такого вида:
Назначение важных полей описано в следующем разделе.
Манифест XML
Манифест в кодировке UTF-8, описывает общие данные и каждый из содержащихся в пакете файлов в виде
<?xml version="1.0" encoding="utf-8"?>
<Sims3Package Type="тип_пакета" SubType="0x00000000">
...
<Sims3Package Type="тип_пакета" SubType="0x00000000">
...
<DisplayName>оригинальное_(английское)_название_пакета</DisplayName>
<Description>оригинальное_(английское)_описание_пакета</Description>
<Dependencies />
<LocalizedNames>
<Description>оригинальное_(английское)_описание_пакета</Description>
<Dependencies />
<LocalizedNames>
...
<LocalizedName Language="ru-RU"><![CDATA[русское_название_пакета]]>
</LocalizedName>
...
</LocalizedNames>
<LocalizedDescriptions>
<LocalizedDescriptions>
...
<LocalizedName Language="ru-RU"><![CDATA[русское_описание_пакета]]>
</LocalizedName>
...
</LocalizedDescriptions>
<PackagedFile>
<PackagedFile>
<Name>имя_файла</Name>
<Length>длина_файла</Length>
<Offset>относительное_смещение_от_начала_секции_данных</Offset>
<Crc>контрольная_сумма</Crc>
<Guid>GUID</Guid>
<ContentType>тип_данных</ContentType>
<Length>длина_файла</Length>
<Offset>относительное_смещение_от_начала_секции_данных</Offset>
<Crc>контрольная_сумма</Crc>
<Guid>GUID</Guid>
<ContentType>тип_данных</ContentType>
...
</PackagedFile>
...
</Sims3Package>
В общем, там много всего, нам столько в общем случае не надо. Манифест, по сути, является индексной таблицей файла.
Секция данных
Содержит данные, главная особенность, что они могут идти не всплошную, абсолютное смещение блока от начала файла вычисляется как сумма от данных из XML, относительного смещения секции данных из заголовка файла и длины заголовка файла (тех самых 17 байт)