Формат Sims3Pack и его декодирование: Часть практическая, типы данных
Автор: AnriRS
Реализация декодирования формата Sims3Pack содержится в файле siS3PackDecoder.pas
Статьи по теме
- библиотека компонентов для работы с файлами TS3 – Sims3Pack: описание формата, на русском языке;
- библиотека компонентов для работы с файлами TS3 – Sims3Pack: реализация декодера, на русском языке;
Заголовок файла
type
TS3PackHeader = packed record // заголовок файла
SigLength: DWORD; // длина сигнатуры ???
Sig: packed array[0..6] of BYTE; // "TS3Pack"
Version: WORD; // версия ???
Shift: DWORD; // относительное смещение секции данных после заголовка
Sig: packed array[0..6] of BYTE; // "TS3Pack"
Version: WORD; // версия ???
Shift: DWORD; // относительное смещение секции данных после заголовка
end; // TS3PackHeader record
Сделав ему sizeof несложно убедиться, что его размер те самые17 байт.
Для декодирования файла важны два поля:
Sig: packed array[0..6] of BYTE; – содержит текст "TS3Pack"
Shift: DWORD – задает относительное смещение секции данных после заголовка, для получения абсолютного смещения к нему нужно прибавить 17 байт заголовка.
Для обычного использования заголовок не нужен, так «чисто посмотреть» и для отладки.
Индексная запись
Класс записи содержит информацию об одной записи (файла) данных и механизм ее декодирования (работы с вторичным потоком);
type
TS3PackItem = class
...
public
constructor Create(AOwner: TS3PackDecoder); // конструктор класса
destructor Destroy; override; // деструктор класса
procedure FreeStream; // освобождает вторичный поток
procedure UnlinkStream; // удаляет ссылку на вторичный поток
procedure Decode(AStream: TStream); // декодирует данные записи
function Decoded: boolean; // проверяет запись на декодированность
property FileName: string read; // имя файла
property Length: cardinal read; // размер файла
property Offset: cardinal read; // относительное смещение начала файла
property CRC: string read; // контрольная сумма
property GUID: string read; // глобальный идентификатор
property ContentType: string read; // тип данных
property Stream: TStream read write;
end;
Свойства
- FileName: string – имя файла, только чтение;
- Length: cardinal –длина файла, только чтение;
- Offset: cardinal – относительное смещение от начала секции данных, только чтение;
- Crc: string –контрольная сумма, только чтение;
- Guid: string – GUID, только чтение;
- ContentType: string – тип данных, только чтение;
- Stream: TStream – ссылка на вторичный поток, чтение/запись;
Методы
- constructor Create(AOwner: TS3PackDecoder) – конструктор класса, как аргумент получает декодер, индексной таблице которого принадлежит запись;
- destructor Destroy; override – виртуальный деструктор освобождает вторичный поток и запись, вместо него нужно использовать Free;
- procedure FreeStream – освобождает вторичный поток (вызывает его Free), то же что и Stream:= nil, но работает быстрее;
- procedure UnlinkStream – удаляет ссылку на вторичный поток, но не удаляет его, необходимо вызывать ее, а не FreeStream, если поток использовался в TDBPF2Decoder как первичный;
- procedure Decode(AStream: TStream) – декодирует запись, то же что и Stream:= AStream, но работает быстрее, если запись уже декодирована, то вначале освобождает старый вторичный поток;
- function Decoded: boolean – возвращает true, если запись уже декодирована;
Прочие типы
Исключения
type
ES3PackDecoderError = class (Exception); // базовый класс ошибки декодера
ES3PackHeaderError = class (ES3PackDecoderError); // ошибка заголовка