Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1133850359
Bogdan1024
2005-12-06 09:25
2005.12.25
упаковать в компонент


14-1133189145
Yegorchic
2005-11-28 17:45
2005.12.25
Соединить SonyEricson с PocketPC (Asus) через ИК-порт


1-1133301323
rel_
2005-11-30 00:55
2005.12.25
Проблема с чтением данных из Excel


11-1115316782
Sphinxx
2005-05-05 22:13
2005.12.25
Скачивание фалов с инета


3-1131438547
XGarik
2005-11-08 11:29
2005.12.25
Вложенный DataSet





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский