![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск в бинарном файле [D5, WinXP]
Dimaxx © (2004-09-24 23:32:00)
Страницы: < 1 2 3 4 5 6 7 8 9 10 ... 13 14 >
Сабж. Нужен алгоритм действительно быстрого поиска последовательности байт любой длины в файлах любого размера (до гигабайта). Читать кусками по-деревенски не катит. Раньше у меня был алгоритм, но с падением Фуджика все пропало.
Sha (2004-10-06 18:18:00) [41]Defunct © (06.10.04 18:07) [222]
Строку из одного 'a' тест никогда не генерирует.
В тесте используются строки длиной 4*n+3 - они с учетом
терминатора всегда занимают целое число двойных слов.
Sha (2004-10-06 18:13:00) [42]> Defunct
Ломается при таком обращении ConstantPos('ef9','efg').
Первая пересылка
@@Scan4:
Mov Ch,[EAx]
проходит нормально, т.к. адрес в edx выровнен.
При заходе на вторую пересылку адрес в edx уже на 1 больше.
Старший байт читаемого слова лежит на защищенной странице => AV.
Defunct (2004-10-06 18:07:00) [43]Или я что-то там не понял, или тест работает не совсем корректно.
Хочу немного уточнить задачу.
Допустим строка из одного символа 'a', она ведь поидее выровняна до DWord т.е. реальная длинна = |-8| + 4 = 12
-8 Dword
-4 Dword
0 'a'
1 0
2 мусор
3 мусор
У меня происходит чтение строки
@CharPos:
Mov EAx, [EDx]
за DWord выхода нет, но Validation0 вызывает исключение именно на этой строчке. Поставил проверку на 0 (думал может туда случайно проходит вызов при буфере = 0) ничего не изменилось.
Jeer (2004-10-06 18:04:00) [44]Грандиозно мужики !
Живо мне напомнило успешные попытки втиснуть в 64K и добиться нужного быстродействия для бортового компьютера на i8080 (580)
решения навигационных задач подводного средства движения в далекие 70-е годы.
Так держать !
Defunct (2004-10-06 17:51:00) [45]> Такой if встречается в 2-х местах (Validate & ValidateAll).
Исправил оба?
Исправил только ValidateAll,
все теперь порядок, вижу где выходит.
сейчас подправлю.
Sha (2004-10-06 17:43:00) [46]> Defunct © (06.10.04 17:25) [218]
> if Validate0 {[198]} and
Такой if встречается в 2-х местах (Validate & ValidateAll).
Исправил оба?
> Если вас не затруднит, ...
Давай на "ты". Конечно, посмотрю. Но чуть позже.
Defunct (2004-10-06 17:25:00) [47]> Sha
хм..
if Validate0 {[198]} and
Validate1 and
Validate2 and
Validate3 and
Validate4 and
Validate5 and
Validate6 and
Validate7 and
Validate8 and
Validate9 and
Validate10 and
Validate11 then
PosDef_MMX Passed
Если вас не затруднит, можете посмотреть где именно происходит выход за границу последнего Dword, потому как проверял на разных компах, везде проходит. (сам я не могу найти).
Sha (2004-10-06 17:02:00) [48]> Defunct © (06.10.04 16:33) [216]
> Функция [193] прошла тест [198] так что можете смело использовать.
На моем компьютере не проходит.
Defunct (2004-10-06 16:33:00) [49]>Sha [198]
Функция [193] прошла тест [198] так что можете смело использовать.
> Ihor Osov'yak © (06.10.04 01:06) [204]
[193] - полный рабочий вариант кода.
[195] - тесты PosDef_MMX = [193]
GuAV (2004-10-06 12:13:00) [50]Sha © (06.10.04 09:47) [212]
Я поняла в чём дело.
Call @@CharPos
Отсюда вход с not alined EDX.
GuAV (2004-10-06 12:13:00) [51]Sha © (06.10.04 09:47) [212]
Я понял в чём дело.
Call @@CharPos
Отсюда вход с not alined EDX.
Sha (2004-10-06 09:48:00) [52]Конец строки (терминатор) фиксирован на верхнейгранице страницы.
Sha (2004-10-06 09:47:00) [53]> GuAV © (06.10.04 01:28) [207]
> Хотя в тесте от Sha тоже ошибка. Или фича. Мы ведь
> договорились, что строка начинается на границе двойного слова или как ? [183]
У меня так и сделано.
Длина строки = 4n+3.
Конец строки (терминатор) фиксирован на нижней границе страницы.
Начало строки плавает. Но всегда находится на грацице двойного слова.
GuAV (2004-10-06 03:12:00) [54]Тут появиась мысль, ка сделать фцию, проходящую любые подобные validate0. Надо сделать вначале test edx, 3; jnz odd_align и там обработать такую ситуацию, обработав эти 1..3 байт и вернуться. Код обработки может быть и не оптимальным, лишь бы он корректно работал.
GuAV (2004-10-06 02:07:00) [55]Хотя поскольку ошибка приведёт AV именно в месте его причины, а не далеко после процедуры можно просто завернуть её в
try... except on EAccesViolation do Result:=0 end;
Этот код может кому-то не понравится, но он нужен только в случае вольностей упомянутых в [208], в "нормальном" режиме функция не приводит к AV.
GuAV (2004-10-06 01:58:00) [56]Тогда берите любую функцию от JOH. Они прошли даже мой агрессивный тест, когда даже к 0-терминатору обратится нельзя.
Ihor Osov'yak (2004-10-06 01:49:00) [57]2 [207] GuAV © (06.10.04 01:28)
ну, иногда лучше перебдить, чем недобдить..
Предположим фантастический вариант - я содал тело строки ручками.. не на границе двойного слова. И передал как параметр.. :-)
Лично я не сторонник таких финтов, но в принцыпе такое может быть. Поэтому я бы дал предпочтение функции, прошедшей валидацию от Sha.
GuAV (2004-10-06 01:28:00) [58]Хотя в тесте от Sha тоже ошибка. Или фича. Мы ведь договорились, что строка начинается на границе двойного слова или как ? [183]
Видимо прийдётся делать Validate для Validate 0 8-))
Ihor Osov'yak (2004-10-06 01:20:00) [59]2 [205] GuAV © (06.10.04 01:16)
ок, либо подожду, либо когда-то повожусь с вашим кодом. может. если будет время и энтузиазм..
GuAV (2004-10-06 01:16:00) [60]Ihor Osov'yak © (06.10.04 01:06) [204]
пока что [193]. Однако он ещё не проходит тест на выход из буфера.
[203] - я привел ошибочный код. как сейчас понял зря.