Распаковка базы Database(lmp).res
#10
Я копался в форматах ?DB и нашёл некоторые моменты, которые не говорил САНЕК7. В частности это касается того, что в конце каждой БДи есть "хвостик", который у них всех одинаковый и размер строчек рассчитывать надо немного иначе. Smile

Вот ещё раз формат ?DB:
Код:
X+0000 - ID файла [1Байт];
X+0001 - Размер файла [4Байта];
 Y+0000 - ID-номерок блока [1Байт];
 Y+0001 - Размер блока [4Байта];
   Z+0000 - ID строки [1Байт];
   Z+0001 - Размер строки [*];
     T+0000 - ID-номерок параметра [1Байт];
     T+0001 - Размер параметра [1Байт];
     T+0002 - Сам параметр;
...
E+0000 - 00,00,02,0C,02,08,01,00,00,00.
Далее слово "Пред" обозначает "Предыдущий"...

X - Адрес начала файла:
Всегда равен 0000 Smile ;

Y - Адрес очередного блока:
Если блок первый, то равен 0005 Smile , а если не первый, то вычислается так:
(РазмерПредБлока/2)+АдресПредБлока+РазмерЗаголокаПредБлока,
РазмерЗаголовкаПредБлока=5;

Z - Адрес очередной строки:
Если строка первая, то равен "АдресБлока+РазмерЗаголовкаБлока", иначе:
(РазмерПредСтроки/2)+АдресПредСтроки+РазмерЗаголовкаПредСтроки;

T - Адрес очередного параметра:
Если параметр первый, то равен "АдресСтроки+РазмерЗаголовкаСтроки", иначе:
(РазмерПредПараметра/2)+АдресПредПараметра+РазмерЗаголовкаПараметра
РазмерЗаголовкаПараметра=2;

E - Адрес после блока файла.
Равен (РазмерФайла/2)+РазмерЗаголовкаФайла,
РазмерЗаголовкаФайла=5, РазмерХвостаФайла=10.

И ещё один нюанс:
[*] - самый каверзный параметр. Расчитывается так:
Считываем аж 4 байта!!! :o Если второй байт больше 0, третий байт не равен 2, а четвёртый байт равен 0, то размер длины строки long, иначе размер длины строки byte.

Естесственно, как писал Санёк7, Размеры типа long надо отнимать на 1 и делить на 2, а размеры типа byte надо просто делить на 2. Хотя в обоих случаях можно просто обойтись целочисленным делением на 2. Wink

=============================
М-да, зделал DBMerger.exe и уже его 2 раза успели скачать, а за день даже никто не сказал, что он не работал! :o Blush (Хотя бы в PM написали бы).
Прошу прощения, за нерабочую программу. Теперь сделал вторую версию. На этот раз точно проверил её работоспособность. Работает вроде.

DBMerger2 может объединить IDB, LDB, PDB, DB, SDB, UDB - остальные ещё не проверял. С его помощью станет гораздо легче объединять MOD'ы. Wink Уже смог с её помощью объединить Evil-MOD с EI-MOD'ом.

Параметры DBMerger2 на примере:
DBMerger2.exe EI-MODitems.idb Evil-MODitems.idb Newitems.idb -info
В итоге получим объединённую БДю. Если в EI-MOD'е и Evil-MOD'е будут одинаковые вещи (а они будут), то в объединённую БДю попадут вещи из Evil-MOD'а, т.к. он написан вторым. Smile Параметры -info заставляет программу очень подробно описывать свои действия.

Размер проги большой, т.к. она работает только в DEBUG конфигурации. В RELEASE конфигурации она уже работает неверно, непонятно почему. :unsure: А никто не знает, почему такое может быть в Visual C++? Huh (Если нет возможности ответить, то, pls, напишите в PM)


Файлы вложений
.zip   DBmerger2.zip (Размер: 31.63 KB / Загрузок: 646)
Ответ


Сообщения в этой теме
Распаковка базы Database(lmp).res - от ELF - 31.05.2004, 23:11
Распаковка базы Database(lmp).res - от Guest - 16.02.2012, 14:39
Распаковка базы Database(lmp).res - от Guest - 07.03.2012, 18:50
Распаковка базы Database(lmp).res - от Guest - 16.03.2012, 19:02

Перейти к форуму:


Пользователи, просматривающие эту тему: 7 Гость(ей)