Форум: "Основная";
Текущий архив: 2005.12.25;
Скачать: [xml.tar.bz2];
ВнизПоиск в бинарном файле Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.013 c