Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2009, 16:51   #1
GanGSISoft
Пользователь
 
Регистрация: 30.05.2008
Сообщений: 25
По умолчанию Поиск Hex данных в большом файл

Мне нужно найи определённую последовательность байтов в файле 30mb и узнать её адрес
Я намисал алгоритм, но оно мне искало гдето 1мин, и то эти байты ноходились на 1/5 файла, может подскажете как оптимизировать мне это

Вот код:
Код:
function compareArrays(ar1,ar2:array of byte):boolean;
var i:byte;
begin
result:=true;
  for i:=1 to 7 do begin
    if ar1[i]<>ar2[i] then begin result:=false; exit;end;
  end;                                                   
end;

function findFun(path:string;ar:Array of byte):string;
var f:file;
    j,x:byte;
    a:array[1..16] of byte;
    i:longint;
begin
  assignFile(f,path);
  reset(f,1);
   for I:=1 to 30146559 do begin
    seek(f,i);
    for j:=1 to 7 do begin
     blockread(f,x,1);
     a[j]:=x;
    end;
    if compareArrays(ar,a)=true then showmessage(IntToHex(i,8));
   end;
  closeFile(f);
  result:='';
end;
GanGSISoft вне форума Ответить с цитированием
Старый 01.07.2009, 16:55   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Можно попробовать работу с TFileStream.
Или загружать с blockread поблочно в динамический массив размером 1/10 размера файла и в массиве уже искать
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.07.2009, 16:42   #3
GanGSISoft
Пользователь
 
Регистрация: 30.05.2008
Сообщений: 25
По умолчанию

Я загрузил файл в память, оказалось что поиск идёт очень быстро, основное время уходит на занрузуку файла в память, это наверное из=за blockread(f,x,1); А как файл можно в масив побыстрее загрузить.

А всё, ну я и наморозил, сделал вот так
blockread(f,fx,30146559); теперь вроде работает.

Последний раз редактировалось GanGSISoft; 02.07.2009 в 17:12.
GanGSISoft вне форума Ответить с цитированием
Старый 02.07.2009, 20:23   #4
GanGSISoft
Пользователь
 
Регистрация: 30.05.2008
Сообщений: 25
По умолчанию

А может подскажете какой алгоритм поиска массива в массиве применять, а то мой(последовательность из n чисел сравнивается с всеми последовательностями из n чисел) чем длинее масив который нужно искть время увеличивется гораздо сильнее.
GanGSISoft вне форума Ответить с цитированием
Старый 02.07.2009, 20:39   #5
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Ну да, так и надо — со ВСЕМИ. Только не весь массив сравнивай — а до первого несовпадения.

Например, найдем "XYZa" в алфавите: ABCDE...xyz. На 24-м сравнении найдётся! И потом ещё 28 холостых, а быстрее никак. Это же не бинарный поиск в упорядоченном файле!

А если искомый массив не более 255 цифр, то его можно найти из окна поиска в Word. Word как-то очень быстро ищет! Ну не в 30 мегабайтах, но мегабайт по 10, думаю, осилит.

Последний раз редактировалось Sasha_Smirnov; 02.07.2009 в 20:59.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 02.07.2009, 22:38   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а ещё есть такой алгоритм поиска, который называется быстрый поиск алгоритмом Бойера — Мура (the Boyer-Moore algorithm)
реализаций его полно, в том числе и для Pascal/Delphi...
Там фишка в том, что чем длинее строка поиска, тем быстрее происходит поиск... рекомендую попробовать/потестировать...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.07.2009, 15:36   #7
GanGSISoft
Пользователь
 
Регистрация: 30.05.2008
Сообщений: 25
По умолчанию

Sasha_Smirnov, ну я так и сдлаю, у меня HEX ркдаутор ищет за доли секунды надпись вконце файла, а прога что-то дольше.
Serge_Bliznykov, интересно попробую. А где достать реализацию на Delphi. Только нормальную.

Последний раз редактировалось GanGSISoft; 03.07.2009 в 15:58.
GanGSISoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск данных в БД sw47 БД в Delphi 15 08.12.2008 09:59
Загрузка и поиск в большом файле. Алексей_M Помощь студентам 15 03.09.2008 10:49
как в Си прочитать ЕХЕ файл в HEX виде ?? Юрий_BASE Общие вопросы C/C++ 1 18.04.2008 22:54
Крестики-нолики на большом поле Pascal Juice Помощь студентам 14 16.04.2008 23:07
Поиск данных aston Microsoft Office Excel 9 04.04.2008 16:30