Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Help с программой (http://forum.oszone.net/showthread.php?t=75041)

nemo555 22-11-2006 21:17 515636

Help с программой
 
Я начинаю только изучать делфи. Кое что освоил. Но вот задумал написать прогу. Как мне сделать,чтоб:открываем файл(бинарник),и чтоб прога начинала в нём искать заданные мною фрагменты в hex-формате. И потом найденные фрагменты надо вывести куда нибудь(в таблицу). И чтоб потом можно было заменить найденные франменты на свои. Помогите плиз
Для начала помогите с организацией поиска найденных заранее определённых кусков бинарника в таблицу. Как мне лучше будет искать изначально заданные фрагменты загруженного файла?
Файл я открываю через файл. потоки:

procedure TForm1.N2Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
fs:=TFileStream.Create('111.bin', fmOpenReadWrite);
end;
end;

ivank 22-11-2006 22:30 515661

nemo555
По большому счёту принцип работы программы от языка не зависит. Прямая дорога к алгоритма поиска подстроки в строке. Я бы рекомендовал реализовать КМП (как самый попсовый) или сдвиг-или (как очень простой в реализации, если разобраться с его сутью. Но у него есть ограничение на длину искомой подстроки). Если файл заведомо меньше доступного объёма (виртуальной) памяти, то я бы банально считал его в память целиком для дальнейшего поиска требуемого фрагмента.

DillerInc 22-11-2006 23:23 515680

Цитата:

Я бы рекомендовал реализовать КМП (как самый попсовый)
...а что в нём такого попсового?? :huh:

Можно попробовать следующим образом,но тут идёт подход с проекцией файла:

Код:

var
 hExe, FileSize, hFileMapping, MapViewPtr : Cardinal;
 Pos : Integer;
begin
// Открываем файл
 hExe := CreateFile(OpenDlgBox.lpstrFile, GENERIC_READ, 0, nil, OPEN_EXISTING,
                    FILE_ATTRIBUTE_NORMAL, 0);
// Получаем размер файла
 FileSize := GetFileSize(hExe, nil);
// Создаём проекцию файла
 hFileMapping := CreateFileMapping(hExe, nil, PAGE_READWRITE, 0, 0, nil);
// Отображаем созданную проекцию в адресное пространство вызывающего процесса
 MapViewPtr := MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
// Тут начинаем искать нужную сигнатуру,например:
 for Pos := 0 to FileSize do
  if MapViewPtr[Pos]  = $3D then  // ассемблерная команда CMP EAX, 2000
  if MapViewPtr[Pos+1] = $00 then
  if MapViewPtr[Pos+2] = $20 then
  if MapViewPtr[Pos+3] = $00 then
  if MapViewPtr[Pos+4] = $00 then
  begin
    Типа нашли!!;
    Break;
  end else Типа ничего не нашли;
// Ну и в конце концов...
// Сворачиваем отображение в памяти
 UnMapViewOfFile(MemPtr);
// Закрываем проекцию файла
 CloseHandle(hFileMapping);
// Закрываем открытый файл
 CloseHandle(hExe);
end;

В общем,что-то вроде этого.Только имей в виду,что в коде наверняка есть ошибки, т.к. я уже давно на Дельфях ничего не писал.

ivank 22-11-2006 23:32 515684

DillerInc
Цитата:

...а что в нём такого попсового??
в данном случае "попсовый" - синоним слова популярный. Я например кроме него других алгоритмов и не смогу по памяти реализовать. За ненадобностью.

nemo555 03-12-2006 00:11 520076

Всем спасибо. Буду разгребать. Ещё вопросик. Как лучше сделать округление числа. Я использую ф-ю round. Но получается полное округление. А мне надо допустим до одной десятой. Пример: 12,5467845416216
Округлить надо до одной цифры после запятой. Через какую ф-ю сделать?

CyraxZ 03-12-2006 09:43 520156

round((12,5467845416216)*10) / 10 = 12,500000000000...

Diseased Head 03-12-2006 12:56 520203

CyraxZ Молоток! Отсюда вывод - хочеш быть хорошим программистом, надо хорошо знать математику. :advice:


Время: 02:06.

Время: 02:06.
© OSzone.net 2001-