Как сделать несколько поисков внутри объекта NSData?

TL, DR

Смотрите эту функцию члена NSData (Свифт здесь):

func rangeOfData(_ dataToFind: NSData, options mask: NSDataSearchOptions, range searchRange: NSRange) -> NSRange

Я хочу заменить этот первый параметр на Set (или другая коллекция) NSData и верните первый матч. Шаблон данных может быть подмножеством другого, поэтому возвращайте самое длинное совпадение. Есть идеи?

Я слышал, что этот метод использует что-то вроде Бойера-Мура в своей реализации. Так что мое расширение, вероятно, будет использовать что-то вроде Aho-Corasick.

Слишком долго...

Я хочу читать файлы электронной почты.

Я планирую читать файлы построчно, поэтому мне нужен алгоритм обнаружения разрыва строки. Стандарт CRLF, но я должен сканировать только-CR, just-LF и (для завершения) LFCR. Обратите внимание, что я читаю в двоичном, где двоичный текст делается на более позднем этапе, так что все те NSString а также NSRegularExpression вещи мне не помогут.

Я собирался написать нестандартную процедуру, а потом понял, что могу обобщить ее. Я создал класс узла дерева разбора, класс скелета генератора строк и кучу тестов. Я откладывал на части кода: сканирование входных байтов, создание деревьев разбора и обход деревьев разбора. Я все еще откладываю, оглядываясь здесь во второй раз, потому что это похоже на проблему, которую должны были делать наши предки-программисты и для которой уже есть код.

На этот раз я узнал об алгоритмах сопоставления строк, так что, надеюсь, я на шаг ближе (помимо перевода их на Swift).

Или, может быть, я должен отказаться от обобщения и позвонить rangeOfData: options: range: в два прохода каждый цикл, один для CR и один раз для LF и согласовать их. Это неэффективно, хотя. Или сохраните идею нестандартного списка; создайте дерево с ветвью для каждого шаблона, объединяя префикс перекрытия с веткой с несколькими узлами. (При поиске в обратном направлении делайте ориентированные на суффиксы ветки!) Несколько проходов здесь будут еще более неэффективными.

Обратите внимание, что NSData имеет функцию для прохождения своих данных в виде серии блоков. Я собирался использовать эту функцию, но я должен быть осторожен, чтобы шаблон мог быть разбит на два (или более!) Блока.

0 ответов

Другие вопросы по тегам