Последние записи
- Рандомное слайдшоу
- Событие для произвольной области внутри TImage
- Удаление папки с файлами
- Распечатка файла
- Преобразовать массив байт в вещественное число (single)
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
21st
Май
Распаковщик формата .img из GTA San Andreas
Posted by Chas under Delphi
Грубо говоря есть некая игра, у которой ресурсы хранятся в архивах, самые крупные это *.img. Нашел информацию об данном формате
Заголовок:
4 байта - CHAR[4] - сигнатура архива, всегда имеет значение "VER2"
4 байта - DWORD - общее количество элементов (файлов)
Элемент: (повторяется n-раз, где n - общее количество элементов):
4 байта - DWORD - смещение файла (в блоках) в архиве
4 байта - DWORD - размер файла (в блоках)
24 байта - CHAR[24] - имя файла
Anton911
var
Form1: TForm1;
Head:Ansichar;
ElementCount:DWORD;
ImgArhStream:TFileStream;
const
ArhBlockCount=2048; //Размер одного архивного блока (байт)
FileExtr=300; //Читаем только 300 файлов из общего числа
implementation
{$R *.dfm}
procedure TForm1.Button_OpenIMGClick(Sender: TObject);
begin
if FileExists(Edit_PathToImg.Text) then
Begin
ImgArhStream:=TFileStream.Create(Edit_PathToImg.Text, fmOpenReadWrite);
ImgArhStream.Read(Head,4); //Считываем 4 байта из заголовока
ImgArhStream.Read(ElementCount,4); //Считываем колличество элементов
Memo_Console.Lines.Add('Заголовок '+String(Head)+' колличество файлов '+IntToStr(ElementCount));
GetFilesInfoFromImg;
ImgArhStream.Free;
End;
end;
procedure TForm1.GetFilesInfoFromImg;
var
FileOffset:DWORD;
FileStrange:DWORD;
FileNameChr: array[0..23] of AnsiChar;
FileIndex:LongInt;
begin
Process.Min:=0;
Process.Max:=FileExtr;
try
Begin
for FileIndex := 0 to FileExtr-1 do
Begin
ImgArhStream.Seek(FileIndex*32+8,0); //24 байта имя файла, 4 байта размер, 4 байта смещение и +8 байт заголовок
ImgArhStream.Read(FileOffset,4); //Считываем смещение
ImgArhStream.Read(FileStrange,4); //Считываем размер
ImgArhStream.Read(FileNameChr,24); //Считываем имя
Memo_Console.Lines.Add('Файл: Номер '+IntToStr(FileIndex)
+'; Название '+String(FileNameChr)
+'; Размер байт'+IntToStr(FileStrange*ArhBlockCount)
+'; Смещение байт '+IntToStr(FileOffset*ArhBlockCount));
Process.Position:=FileIndex;
Form1.Caption:=IntToStr(FileIndex);
ExtractFile(FileStrange,FileOffset,FileNameChr);
End;
End;
except
on E: Exception do
begin
showmessage('Ошибка, не важно');
end;
end;
end;
procedure ExtractFile(Strange,Offset:DWORD;FileName:Array of AnsiChar);
var
BlockIndex:integer;
TempChr:array[1..2048] of AnsiChar;
SaveFile:TFileStream;
ByteStrange:integer;
StrangeIndex:integer;
begin
SaveFile:=TFileStream.Create(String(FileName),fmCreate {fmOpenWrite});
ImgArhStream.Position:=ArhBlockCount*Offset;
ByteStrange:=Strange*ArhBlockCount;
try
for StrangeIndex := 1 to Strange do
begin
ImgArhStream.Read(TempChr,ArhBlockCount);
SaveFile.Write(TempChr, ArhBlockCount);
end;
finally
SaveFile.Free;
end;
end;
Случайные статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)