поиск шаблонов в шестнадцатеричном файле - PullRequest
2 голосов
/ 15 февраля 2012

У меня есть два разных файла, каждый из которых поступает из разных потоков данных.У меня есть некоторые данные из этих потоков в двух разных файлах.Затем я хочу выполнить поиск в файлах, чтобы найти какие-либо шаблоны, чтобы на более позднем этапе, если я соберу больше данных из потоков, я смог определить, какие данные принадлежат какому потоку (на основе шаблонов, которые я обнаружил).ранее).

Примером данных, содержащихся в файле, может быть: b0 82 91 a2 c3 89 b0 82 4a e3 .... (больше байтов) ... Хотя я взял здесь очень мало байтов, но мыможно найти образец "b0 82", идущий в два раза выше.Таким образом, выходные данные должны показать шаблон и время, когда оно наступает.Точно так же мы можем иметь 3-байтовый шаблон или даже более байтовый шаблон.

Еще одним примером может быть: aa 00 a7 2f 7b 4c .... (больше байтов) ..... aa 01 a7 ......... (больше байтов) ...... aa 05 a7 ..... Я думаю, что даже это можно считать шаблоном из 3 байтов, где два байта (aa и a7) фиксированы, а средний изменяетсяс 00 до 05.

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

  1. Как мы можем сделать этот тип поиска образца?

  2. Есть ли какие-либо инструменты или библиотеки, которые могут помочьдля этого?

  3. Кроме того, какой язык или инструмент использовать для эффективной и быстрой разработки?

  4. Может ли область интеллектуального анализа данных помочь с этой целью?Если да, то как это сделать?

Ответы [ 4 ]

1 голос
/ 20 мая 2013

Это похоже на довольно типичную проблему поиска ngram. Вот ссылка на некоторые решения ngram.

более быстрый способ обнаружения n-граммов в строке?

Вы должны обращаться со своим гексом так же, как с любой другой строкой.

0 голосов
/ 07 марта 2012

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

Имея в виду все эти квалификации, вы можете попробовать использовать суффиксное дерево или суффиксный массив . Особенно для деревьев суффиксов существуют алгоритмы, которые позволяют вам постоянно обновлять дерево при добавлении символов к тексту (так называемое построение дерева суффиксов ), в особенности алгоритм Укконена. Это может особенно хорошо работать с использованием потоков данных (в отличие от полностью определенного входного текста фиксированной длины).

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

Для подробного ознакомления с этими структурами данных и если у вас есть доступ к университетской библиотеке или есть деньги, Введение Дана Гасфилда в алгоритмы для строк, деревьев и последовательностей будет очень полезно. Но в SO также есть ряд вопросов и ответов, связанных с этим.

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

0 голосов
/ 07 марта 2012

Вы можете обучать Марковские модели или даже скрытые Марковские модели в своих потоках и использовать эти модели, чтобы решить, к какому потоку больше всего относятся новые данные. Предположительно существуют десятки библиотек, которые могут сделать это на выбранном вами языке программирования.

Может быть, начать с чтения книги. Я предлагаю Распознавание образов от C. Bishop.

0 голосов
/ 16 февраля 2012

Ваш вопрос не полностью определен, но я постараюсь дать вам несколько советов:

  1. Ваши шаблоны, вероятно, могут быть выражены как регулярные выражения. Если вы не знаете, что это такое - я постараюсь найти конкретный пример на вашем любимом языке программирования. Python - хороший вариант (модуль re включен в основной язык). Для C ++ используйте boost :: regex, а для других языков используйте google:)

  2. Теперь - для использования регулярных выражений для поиска двоичных файлов (шестнадцатеричных) вместо текста, попробуйте посмотреть что-то вроде this .

Удачи:)

...