Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.25;
Скачать: CL | DM;

Вниз

Поиск в бинарном файле   Найти похожие ветки 

 
igi   (2005-11-25 20:48) [0]

Может у кого есть алгоритм быстрые. Нужно найти смещение в файле по которому расположена некая последовательность байт. Только нужно быстрый способ, требуется искать около 20 таких последовательностей в одном файле. А то тот которым делаю я секунд 20 все делает. Я делаю так

function Searche_offset_str(s, filename: string) : string;
var
f: file;
l: Longint;
oldstring, newstring: string;
begin
Form1.ProgressBar1.Position := Form1.ProgressBar1.Position + 1;
oldstring := s;
AssignFile(f, FileName);
Reset(f, 1);
for l := 0 to FileSize(f) - Length(oldstring) - 1 do
begin
Seek(f, l);
BlockRead(f, oldstring[1], Length(oldstring));
if oldstring = s then
begin
result := "$"+ IntToHex(FilePos(F)-Length(oldstring), 8);
break;
end;
end;
CloseFile(f);
end;

вот так запустишь эту функцию раз 15 на двестикилобайтном файле так подвисает все секунд на 20..


 
Суслик ©   (2005-11-25 20:50) [1]

если 200 кб, то грузи его весь в память и в ней ищи


 
igi   (2005-11-25 20:54) [2]

Ой, да я с памятью работать не умею... :) Если есть пример - буду благодарен ;)


 
OldNaum ©   (2005-11-25 21:43) [3]

<offtop>
ну че, на cracklab"у разве не помогли? ))
</offtop>


 
igi   (2005-11-25 21:46) [4]

:)))
я асм толком не знаю - а этом форуме помогут с дельфи :)


 
Eraser ©   (2005-11-25 23:05) [5]


> igi   (25.11.05 20:48)

В руководстве разработчика по Делфи 5 Тейксейра, Пачеко в главе 12 есть параграф "Утилита поиска в текстовых файлах", где приводиться пример поиска строки в текстовых файлах с пом. файлов, отображаемых в памяти, этот пример легко переделать для поиска любой последовательности данных в любых файлах.


> AssignFile(f, FileName);
> Reset(f, 1);

Когда же уже студентам начнут объяснять, что на досовском паскале и c++ свет клином не сошёлся ....?!


 
Eraser ©   (2005-11-25 23:06) [6]


> Eraser ©   (25.11.05 23:05) [5]


> главе 12

а точнее в 1 томе, 2 часте, главе 12.


 
palva ©   (2005-11-26 11:05) [7]

Во-первых, ваша программа многократно читает один и тот же байт (столько раз, сколько символов в строке поиска). Во вторых она читает файл очень небольшим куском, а это тоже сильно сажает производительность.

Я бы написал программу без использования строк. Выделил бы два последовательно расположенных буфера по несколько килобайт, прочитал бы два буфера из файла и начал бы поиск. А когда буфера кончатся сдвигал бы второй буфер на место первого, дочитывал из файла во второй буфер, уменьшал бы текущую позицию поиска и искал дальше. Для сравнения двух последовательностей байтов использовал бы API функцию lstrcmp, для этого пришлось бы устанавливать в буфер нулевой завершитель строки, а после сравнения восстанавливать этот байт буфера в прежнее значение.

Это если вам скорость нужна.


 
Loginov Dmitry ©   (2005-11-26 11:56) [8]

Объявляешь массив длиной 8192 байта и считываешь в него последовательно блоки, в которых и выполняешь поиск нужного фрагмента. Мой совет: не используй никаких функций по преобразованию строки в число (или наоборот) в теле цикла, делай все это до него; не применяй динамически формируемые множества, так как они сильно тормозят поиск. В результате скорость поиска должна получиться не меньше, чем в Total Commander.


 
begin...end ©   (2005-11-26 12:01) [9]

> palva ©   (26.11.05 11:05) [7]

> Для сравнения двух последовательностей байтов использовал
> бы API функцию lstrcmp, для этого пришлось бы устанавливать
> в буфер нулевой завершитель строки, а после сравнения восстанавливать
> этот байт буфера в прежнее значение.

Для сравнения двух последовательностей байтов я использовал бы функцию CompareMem. При этом не пришлось бы устанавливать в буфер нулевой завершитель строки, а после сравнения восстанавливать этот байт буфера в прежнее значение.


 
palva ©   (2005-11-26 14:20) [10]

begin...end ©   (26.11.05 12:01) [9]
Да, точно. Забыл про эту функцию.


 
Набережных С. ©   (2005-11-26 14:34) [11]


> begin...end ©   (26.11.05 12:01) [9]

А я бы для 2-х последовательных байт использовал бы PWord^  и это работало бы раз в ...надцать быстрее, чем CompareMem:)


 
palva ©   (2005-11-26 16:30) [12]

Вообще альтернативы lstrcmp я здесь не вижу. Иначе ветка потеряет связь с названием форума. А вот когда ветку перебросят в форум Потрепаться, тогда можно будет обсудить использование CompareMem


 
Набережных С. ©   (2005-11-26 16:41) [13]


> palva ©   (26.11.05 16:30) [12]

А я не вижу смысла в использовании lstrcmp, безотносительно названия конференции.


 
begin...end ©   (2005-11-26 18:59) [14]

> Набережных С. ©   (26.11.05 14:34) [11]

Ну это само собой :-)
Да и для более длинных последовательностей лучше будет перед вызовом CompareMem проверить первые несколько байт, что исключит потерю времени на вызов функции в случае, если эти несколько байт не совпадут.

> palva ©   (26.11.05 16:30) [12]

> А вот когда ветку перебросят в форум Потрепаться, тогда
> можно будет обсудить использование CompareMem

Бог в помощь.


 
igi   (2005-11-27 20:06) [15]

Спасибо всем за подказки


 
Leonid Troyanovsky ©   (2005-11-28 10:23) [16]


> palva ©   (26.11.05 14:20) [10]

> Да, точно. Забыл про эту функцию.


StrLComp


> Набережных С. ©   (26.11.05 14:34) [11]

> А я бы для 2-х последовательных байт использовал бы PWord^


PLongint

--
Regards, LVT


 
Набережных С. ©   (2005-11-28 13:40) [17]


> Leonid Troyanovsky ©   (28.11.05 10:23) [16]


>  я бы для 2-х последовательных байт использовал бы PWord^
>
> PLongint

А че не PDWORD? Обрати внимание, у меня написано "для 2-х последовательных байт". Я думал, что экстраполировать не сложно:(


 
Leonid Troyanovsky ©   (2005-11-28 14:06) [18]


> Набережных С. ©   (28.11.05 13:40) [17]

> А че не PDWORD? Обрати внимание, у меня написано "для 2-
> х последовательных байт". Я думал, что экстраполировать



В цитируемом [9] было "двух последовательностей байтов"
А DWORD - с ним борланды не дружны.

--
Regards, LVT.


 
Набережных С. ©   (2005-11-28 14:36) [19]


> Leonid Troyanovsky ©   (28.11.05 14:06) [18]

Но ты-то меня цитируешь, а не [9]. Ну да, прочитал я неправильно слово в [9] - и что, принципиальная разница?  Отстается только пожать плечами.


 
Leonid Troyanovsky ©   (2005-11-28 14:54) [20]


> Набережных С. ©   (28.11.05 14:36) [19]

> Но ты-то меня цитируешь, а не [9]. Ну да, прочитал я неправильно


Ну, а я чем провинился? Занудством? :)

--
Regards, LVT.


 
evvcom ©   (2005-11-29 08:50) [21]

Вы еще подеритесь, горячие финские парни! (с) "Особенности национальной ..." (охоты вроде или рыбалки?)



Страницы: 1 вся ветка

Текущий архив: 2005.12.25;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.047 c
14-1133262163
CHES
2005-11-29 14:02
2005.12.25
А вы говорите в килограмме 1024 грамма....


2-1134125888
kvorubin
2005-12-09 13:58
2005.12.25
Мужики, как сравнить 2 списка со словами???


14-1133432098
File-Open
2005-12-01 13:14
2005.12.25
Как изменить путь к папке проектов, используемый по умолчанию?


14-1133364781
Piter
2005-11-30 18:33
2005.12.25
Плагин к Miranda


2-1134305743
DIS
2005-12-11 15:55
2005.12.25
Из сервиса (служба NT) выполнить запрос к БД