Показать сообщение отдельно
  #3  
Старый 09.07.2020, 20:10
Alexandr_57 Alexandr_57 вне форума
Прохожий
 
Регистрация: 26.02.2016
Сообщения: 30
Версия Delphi: Delphi XE10
Репутация: 10
По умолчанию

Цитата:
Сообщение от dr. F.I.N.
Я бы работал с классом TFileStream. Считали блок данных размером с искомый паттерн, и посимвольно пробегаем в поиске первого байта паттерна. Если нашли, то запоминаем позицию (начало искомой последовательности) и проверяем следующий бай. Совпал - продолжаем с третьим и т.д. на всю длину паттерна. (если дошли до конца прочитанного блока, то дочитываем недостающую длину и продолжаем сверку). Если же ничего не нашлось, то снова считываем следующую партию байт и повторяем процесс пока не найдем всю последовательность.

А дальше бы уже прибегнул к дополнительному потоку (хоть TFileStream, хоть TMemoryStream). Копируем в дополнительный поток все что до начала искомого паттерна, потом записываем нужный паттерн (PATTERN2) и повторяем все действия до конца файла.

Если нужно, то переносите содержимое дополнительного потока в первый и сохраняете. Или же оригинальный файл переименовывем и сохраняем доп.поток в файл с прежним именем.

С таким подходом не будет никакой разницы какой, какой паттерн длиннее или короче, хоть вообще "удалять" искомый набор байт.

Нужно учитывать что позиция где эти байты находятся находится неизвестно. И более того находиться они будут всегда в разном месте всеже это не программа.

Плюс размер файла большой - 10 - 50 МБ. Число варьируется между этим отрезком. Так что побайтовое чтение будет долгим. Да и мнебы пример. А точнее примеры 3 штуки на 3 варианта.
Ответить с цитированием