Пишу свою программу на Delphi для работы с IMG архивом, это в игрушке GTA San Andreas такой архив. Создаю вот такой packed record ->
Name: array[0..23] of Char;
Index: SmallInt;
Index2: SmallInt;
Index3: SmallInt;
Index4: SmallInt;
Index5: SmallInt;
Index6: SmallInt;
Index7: SmallInt;
потом читаю, block read.
Есть несколько вопросов.
1. Посколько байт надо читать ?.
2. Вообще правильная ли структура описанная мной ?.
Может кто поможет ?.
Структура архива Img.
Автор
Artur
, Aug 11 2005 23:13
Сообщений в теме: 2
#1
Отправлено 11 August 2005 - 23:13
#2
Отправлено 12 August 2005 - 11:30
Artur!
Я не знаю формата описания IMG файлов, но строки в Delphi, лучше читать вот так:
Я не знаю формата описания IMG файлов, но строки в Delphi, лучше читать вот так:
Код |
Var S: String; Begin ..... SetLength(S, 24); BlockRead(Fl, S[1], 24); { теперь в S - нужная строка; если в конце неё нули, то нужно сделать так: While ((Length(S)>0) And (S[Length(S)]=#0)) Do Delete(S, Length(S), 1); чтобы их отрезать } ..... End. |
тогда с ними проще будет дальше работать (если это имя файла и т.д.)
Если же тебя не волнует строка и ты хочешь читать именно структуру, то можно читать вот так:
Код |
Type TRectStruct = Record Name: array[0..23] of Char; Indexs: Array[0..6] Of SmallInt; End; Var RectStruct: Array of TRectStruct; ..... SetLength(RectStruct, N); For I:=1 To N Do { N - сколько структур в файле } BlockRead(Fl, RecStruct[I-1], SizeOf(RecStruct)); .... { ежели тебе всего один раз прочитать нужно, то можно сделать так: } Var RectStruct: TRectStruct; ...... BlockRead(Fl, RecStruct, SizeOf(RecStruct)); |
#3
Отправлено 16 August 2005 - 21:24
Все ! разобрал структуру. 2 дня мучился с Hex-Editor'ом.
Структура такая.
Первые 4 байта - это строчка указывающая что img-архив 2 версии. Она всегда равна = VER2, по ней можно определить что архив именно версии 2. Далее 3 байта , общее кол-во файлов в архиве.
type
TIMGv2Header = packed record
Ver : array[0..4] of Char; //Версия
FileCount : LongWord; // Кол-во файлов
end;
Далее идет перечисление файлов в архиве.
Вот структура на Delphi.
type
TIMGv2 = packed record
StartBlock: Longword; // Положение файла
BlockCount: Longword; // Размер блока
Name: array[0..23] of Char; //Имя файла
end;
Читать надо по 32 байта. Реальное положение файла и размер блока вычисляется , умножением на 2048.
StartBlock * 2048
BlockCount * 2048
Ну и размер файла вычисляется так BlockCount * 2.
Структура такая.
Первые 4 байта - это строчка указывающая что img-архив 2 версии. Она всегда равна = VER2, по ней можно определить что архив именно версии 2. Далее 3 байта , общее кол-во файлов в архиве.
type
TIMGv2Header = packed record
Ver : array[0..4] of Char; //Версия
FileCount : LongWord; // Кол-во файлов
end;
Далее идет перечисление файлов в архиве.
Вот структура на Delphi.
type
TIMGv2 = packed record
StartBlock: Longword; // Положение файла
BlockCount: Longword; // Размер блока
Name: array[0..23] of Char; //Имя файла
end;
Читать надо по 32 байта. Реальное положение файла и размер блока вычисляется , умножением на 2048.
StartBlock * 2048
BlockCount * 2048
Ну и размер файла вычисляется так BlockCount * 2.