Формат DBPF2 и его декодирование: Часть практическая, реализация декодера и кодера
Реализация декодирования формата DBPF2, содержится в файле siS3DBPF2Decoder.pas
Статьи по теме
библиотека компонентов для работы с файлами TS3 – DBPF2: описание формата, на русском языке
библиотека компонентов для работы с файлами TS3 – DBPF2: типы данных, на русском языке;
Базовый класс DBPF2 файла
Методы
constructor Create(AOwner: TDBPF2File) – конструктор класса, как аргумент получает декодер, индексной таблице которого принадлежит запись;
destructor Destroy – виртуальный деструктор, освобождает вторичный поток и запись, вместо него нужно использовать Free;
procedure FreeStream – виртуальный метод, освобождает вторичные потоки, удаляет индексную таблицу, освобождает первичный поток;
Декодер
Свойства
- Items: TDBPF2Items – массив записей по каждому из файлов в пакете, только чтение
- Count: integer – число файлов в пакете, только чтение
- Header: TS3PackHeader – заголовок исходного файла, содержит 96 байт – свойство информационное для отладки, содержит правильные значения только после выполнения метода Decode, после использования метода Add не изменяется, только чтение
Методы
procedure Decode(AReader: TStream) – связывает поток декодирования, декодирует индексную таблицу;
procedure New(AReader: TStream) – связывает поток декодирования, создает пустую индексную таблицу;
procedure Add(const AFrom: TStream; AResourceType: DWORD; AResourceGroup: DWORD; AInstanceHi: DWORD; AInstanceLo: DWORD; AMemSize: DWORD = 0) – добавляет в индексную таблицу из потока AFrom запись, если AMemSize=0, то запись не сжата, и ее размер устанавливается по размеру потока; при передаче 64 разрядного экземпляра он передается по частям: AInstanceHi = Instance shr 32, AInstanceLo = Instance, фактически запись к исходному файлу не добавляется;
procedure Delete(Index: integer) – помечает запись как удаленную, если запись не существует – не делает ничего;
function Find(AResourceType: DWORD; AResourceGroup: DWORD; AInstanceHi: DWORD; AInstanceLo: DWORD): integer – возвращает индекс записи или -1 если запись не найдена;
procedure DecriptP – защищенный метод вызывается из метода Decode автоматически, должен быть определен и реализовывать дешифрацию формата DBPP;
Кодер
Свойства
- Header: TS3PackHeader – заголовок получемого файла, содержит 96 байт – свойство содержит правильные значения после выполнения метода New, после использования методов Add изменяется корректно, Header.IndexOffset содержит размер текущий размер файла без индексной таблицы, Header.IndexSize – текущий размер индексной таблицы, только чтение
Методы
procedure New(AWriter: TStream) – связывает первичный поток (поток кодирования) с кодером, создает пустую индексную таблицу, до вызова метода другие методы и поля (кроме FreeStream и Count) использовать нельзя;
procedure FreeStream – перегруженный виртуальный метод, сохранияет индексную таблицу, затем освобождает вторичные потоки, удаляет индексную таблицу, освобождает первичный поток;
procedure Add(const AFrom: TDBPF2Decoder) – добавляет из потока, связанного с AFrom все записи не помеченные как удаленные, если запись декодирована, то добавляется ее вторичный поток, иначе запись не декодируется (и не расжимается);
procedure Add(const AFrom: TDBPF2Decoder; Index: integer) – добавляет из потока, связанного с AFrom запись с номером Index, если она не помечена как удаленная, если запись декодирована, то добавляется ее вторичный поток, иначе запись не декодируется (и не расжимается);
procedure Add(const AFrom: TStream; AResourceType: DWORD; AResourceGroup: DWORD; AInstanceHi: DWORD; AInstanceLo: DWORD; AMemSize: DWORD = 0) – добавляет из потока AFrom запись, если AMemSize=0, то запись не сжата, и ее размер устанавливается по размеру потока; при передаче 64 разрядного экземпляра: AInstanceHi = Instance shr 32, AInstanceLo = Instance