Четверг, 25.04.2024, 20:17
Приветствую Вас Гость

Каталог статей

Главная » Статьи » 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)
Просмотров: 1410