![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск в бинарном файле [D7]
igi © (2005-11-25 20:48:00)Может у кого есть алгоритм быстрые. Нужно найти смещение в файле по которому расположена некая последовательность байт. Только нужно быстрый способ, требуется искать около 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..
evvcom (2005-11-29 08:50:00) [1]Вы еще подеритесь, горячие финские парни! (с) "Особенности национальной ..." (охоты вроде или рыбалки?)
Leonid Troyanovsky (2005-11-28 14:54:00) [2]
> Набережных С. © (28.11.05 14:36) [19]
> Но ты-то меня цитируешь, а не [9]. Ну да, прочитал я неправильно
Ну, а я чем провинился? Занудством? :)
--
Regards, LVT.
Набережных С. (2005-11-28 14:36:00) [3]
> Leonid Troyanovsky © (28.11.05 14:06) [18]
Но ты-то меня цитируешь, а не [9]. Ну да, прочитал я неправильно слово в [9] - и что, принципиальная разница? Отстается только пожать плечами.
Leonid Troyanovsky (2005-11-28 14:06:00) [4]
> Набережных С. © (28.11.05 13:40) [17]
> А че не PDWORD? Обрати внимание, у меня написано "для 2-
> х последовательных байт". Я думал, что экстраполировать
В цитируемом [9] было "двух последовательностей байтов"
А DWORD - с ним борланды не дружны.
--
Regards, LVT.
Набережных С. (2005-11-28 13:40:00) [5]
> Leonid Troyanovsky © (28.11.05 10:23) [16]
> я бы для 2-х последовательных байт использовал бы PWord^
>
> PLongint
А че не PDWORD? Обрати внимание, у меня написано "для 2-х последовательныхбайт". Я думал, что экстраполировать не сложно:(
Leonid Troyanovsky (2005-11-28 10:23:00) [6]
> palva © (26.11.05 14:20) [10]
> Да, точно. Забыл про эту функцию.
StrLComp
> Набережных С. © (26.11.05 14:34) [11]
> А я бы для 2-х последовательных байт использовал бы PWord^
PLongint
--
Regards, LVT
igi (2005-11-27 20:06:00) [7]Спасибо всем за подказки
begin...end (2005-11-26 18:59:00) [8]> Набережных С. © (26.11.05 14:34) [11]
Ну это само собой :-)
Да и для более длинных последовательностей лучше будет перед вызовом CompareMem проверить первые несколько байт, что исключит потерю времени на вызов функции в случае, если эти несколько байт не совпадут.
> palva © (26.11.05 16:30) [12]
> А вот когда ветку перебросят в форум Потрепаться, тогда
> можно будет обсудить использование CompareMem
Бог в помощь.
Набережных С. (2005-11-26 16:41:00) [9]
> palva © (26.11.05 16:30) [12]
А я не вижу смысла в использовании lstrcmp, безотносительно названия конференции.
palva (2005-11-26 16:30:00) [10]Вообще альтернативы lstrcmp я здесь не вижу. Иначе ветка потеряет связь с названием форума. А вот когда ветку перебросят в форум Потрепаться, тогда можно будет обсудить использование CompareMem
Набережных С. (2005-11-26 14:34:00) [11]
> begin...end © (26.11.05 12:01) [9]
А я бы для 2-х последовательных байт использовал бы PWord^ и это работало бы раз в ...надцать быстрее, чем CompareMem:)
palva (2005-11-26 14:20:00) [12]begin...end © (26.11.05 12:01) [9]
Да, точно. Забыл про эту функцию.
begin...end (2005-11-26 12:01:00) [13]> palva © (26.11.05 11:05) [7]
> Для сравнения двух последовательностей байтов использовал
> бы API функцию lstrcmp, для этого пришлось бы устанавливать
> в буфер нулевой завершитель строки, а после сравнения восстанавливать
> этот байт буфера в прежнее значение.
Для сравнения двух последовательностей байтов я использовал бы функцию CompareMem. При этом не пришлось бы устанавливать в буфер нулевой завершитель строки, а после сравнения восстанавливать этот байт буфера в прежнее значение.
Loginov Dmitry (2005-11-26 11:56:00) [14]Объявляешь массив длиной 8192 байта и считываешь в него последовательно блоки, в которых и выполняешь поиск нужного фрагмента. Мой совет: не используй никаких функций по преобразованию строки в число (или наоборот) в теле цикла, делай все это до него; не применяй динамически формируемые множества, так как они сильно тормозят поиск. В результате скорость поиска должна получиться не меньше, чем в Total Commander.
palva (2005-11-26 11:05:00) [15]Во-первых, ваша программа многократно читает один и тот же байт (столько раз, сколько символов в строке поиска). Во вторых она читает файл очень небольшим куском, а это тоже сильно сажает производительность.
Я бы написал программу без использования строк. Выделил бы два последовательно расположенных буфера по несколько килобайт, прочитал бы два буфера из файла и начал бы поиск. А когда буфера кончатся сдвигал бы второй буфер на место первого, дочитывал из файла во второй буфер, уменьшал бы текущую позицию поиска и искал дальше. Для сравнения двух последовательностей байтов использовал бы API функцию lstrcmp, для этого пришлось бы устанавливать в буфер нулевой завершитель строки, а после сравнения восстанавливать этот байт буфера в прежнее значение.
Это если вам скорость нужна.
Eraser (2005-11-25 23:06:00) [16]
> Eraser © (25.11.05 23:05) [5]
> главе 12
а точнее в 1 томе, 2 часте, главе 12.
Eraser (2005-11-25 23:05:00) [17]
> igi (25.11.05 20:48)
В руководстве разработчика по Делфи 5 Тейксейра, Пачеко в главе 12 есть параграф "Утилита поиска в текстовых файлах", где приводиться пример поиска строки в текстовых файлах с пом. файлов, отображаемых в памяти, этот пример легко переделать для поиска любой последовательности данных в любых файлах.
> AssignFile(f, FileName);
> Reset(f, 1);
Когда же уже студентам начнут объяснять, что на досовском паскале и c++ свет клином не сошёлся ....?!
igi (2005-11-25 21:46:00) [18]:)))
я асм толком не знаю - а этом форуме помогут с дельфи :)
OldNaum (2005-11-25 21:43:00) [19]<offtop>
ну че, на cracklab'у разве не помогли? ))
</offtop>
igi (2005-11-25 20:54:00) [20]Ой, да я с памятью работать не умею... :) Если есть пример - буду благодарен ;)