Каталог статей
Главная » Статьи » S3DecoderLib |
![]() |
S3DecoderLib: DBPF v.2. Реализация декодера и кодера
|
Формат DBPF2 и его декодирование: Часть практическая, реализация декодера и кодера [ Стабильный билд • Описание формата • Типы данных ]
Програмный модуль и версия DBPF2Decoder.pas, rev.130517
Типы данных
class TDBPF2Decoder – декодер type TDBPF2Decoder = class(TComponent) private function GetFNV64: UInt64; protected FCount: integer; // число записей в индекcной таблице FHeader: TDBPF2Header; // декодированный заголовок файла FItems: TDBPF2Items; // декодированная индексная таблица FStream: TStream; // связанный поток чтения FCrypted: boolean; // поток файла DBPP FChanged: boolean; // в поток писали function Alloc: TDBPF2Item; // добавляет запись в индексную таблицу и возвращает ее procedure ResetHeader; // заполняет заголовок значениями "по умолчанию" procedure DecriptP; // декодирует шифрованный заголовок public constructor Create(AOwner: TComponent); override; // контруктор класса destructor Destroy; override; // деструктор класса procedure FreeStream; virtual; // освобождает вторичные потоки, освобождает первичный поток procedure Decode(AStream: TStream); // связывает поток декодирования, декодирует индексную таблицу procedure New(AStream: TStream); // связывает поток декодирования, создает пустую индексную таблицу procedure SaveHeader; // записывает заголовок в файл, требует чтобы FStream был доступен для записи procedure Add(const AFrom: TDBPF2Decoder); overload; procedure Add(const AFrom: TDBPF2Decoder; Index: integer); overload; // добавляет блок данных в поток, блок добавляется без его декомпрессии procedure Add(const AFrom: TStream; AResourceType: DWORD; AResourceGroup: DWORD; AInstanceHi: DWORD; AInstanceLo: DWORD; AMemSize: DWORD = 0); overload; // добавляет блок(и) данных в поток, блок(и) добавляе(ю)тся без его(их) декомпрессии procedure Delete(Index: integer); // помечает запись как удаленную function Find(AResourceType: DWORD; AResourceGroup: DWORD; AInstanceHi: DWORD; AInstanceLo: DWORD): integer; // возвращает индекс записи или -1 property Items: TDBPF2Items read FItems; // декодированная индексная таблица property Count: integer read FCount; // число записей в индекcной таблице property Header: TDBPF2Header read FHeader; // заголовок файла property FNV64: UInt64 read GetFNV64; // контрольная сумма с позиции 96 property Crypted: boolean read FCrypted; // поток файла DBPP end; Свойства Items: TDBPF2Items – массив записей по каждому из файлов в пакете, только чтение Count: integer – число файлов в пакете, только чтение Header: TS3PackHeader – заголовок исходного файла, содержит 96 байт – свойство информационное для отладки, содержит правильные значения только после выполнения метода Decode, после использования метода Add не изменяется, только чтение FNV64: UInt64 – контрольная сумма файла с позиции 96 (т.е. без заголовка), только чтениеCrypted: boolean – признак, что декодирован поток файла DBPP), только чтение
Методы constructor Create(AOwner: TComponent); override – контруктор класса; destructor Destroy; override – виртуальный деструктор класса; procedure FreeStream; virtual – освобождает вторичные потоки, освобождает первичный поток;
procedure Decode(AReader: TStream) – связывает поток декодирования, декодирует индексную таблицу; генерирует исключения: EDBPF2HeaderError(csHeaderIdError) – 'Неверный заголовок файла', если сигнатура файла не 'DBPF' или не 'DBPP'; EDBPF2HeaderError(csHeaderVersionError) – 'Неверная версия заголовка файла', если MajorVersion заголовка файла не равен 2; EDBPF2HeaderError(csHeaderIndexTypeError) – 'Неверный тип индекса', если IndexType файла больше 7; EDBPF2DecriptionError(csEndOfIndexNotFindError) – 'Не удалось найти конец индекса', при сбое декриптора (только для файлов DBPP); EDBPF2DecriptionError(csStepOfIndexNotDetectedError) – 'Не удалось определить шаг индекса', при сбое декриптора (только для файлов DBPP);
procedure New(AReader: TStream) – связывает поток декодирования, создает пустую индексную таблицу; procedure SaveHeader – записывает заголовок в файл, требует чтобы первичный поток был доступен для записи
procedure Add(const AFrom: TDBPF2Decoder); overload – добавляет все блоки из другого декодера; procedure Add(const AFrom: TDBPF2Decoder; Index: integer); overload – добавляет блок данных в поток, блок добавляется без его декомпрессии; procedure Add(const AFrom: TStream; AResourceType: DWORD; AResourceGroup: DWORD; AInstanceHi: DWORD; AInstanceLo: DWORD; AMemSize: DWORD = 0); overload – добавляет блок данных в поток;
procedure Delete(Index: integer) – помечает запись как удаленную, если запись не существует – не делает ничего; function Find(AResourceType: DWORD; AResourceGroup: DWORD; AInstanceHi: DWORD; AInstanceLo: DWORD): integer – возвращает индекс записи или -1 если запись не найдена;
function Alloc: TDBPF2Item – защищенный метод, добавляет запись в индексную таблицу и возвращает ее; procedure ResetHeader – защищенный метод, заполняет заголовок значениями "по умолчанию"; procedure DecriptP – защищенный метод, вызывается из метода Decode автоматически, должен быть определен и реализовывать дешифрацию формата DBPP; | |
Категория: S3DecoderLib | Добавил: crazylab (27.09.2013) | |
Просмотров: 1450 |