【问题标题】:finding patterns in a hex file在 hex 文件中查找模式
【发布时间】:2012-03-06 14:29:43
【问题描述】:

我有两个不同的文件,每个文件的内容都来自不同的数据流。我在两个不同的文件中从这些流中收集了一些数据。然后我想搜索文件以找到任何类型的模式,以便在稍后阶段,如果我从流中收集更多数据,我应该能够区分哪些数据属于哪个流(基于我发现的模式较早)。

文件中包含的数据示例可以是: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. 数据挖掘领域可以为此提供帮助吗?如果是,如何进行?

【问题讨论】:

  • 您能否更具体地说明“模式”的含义?
  • 模式可以是任何可以与其他数据区分开来的东西。例如,它可以是任何字节,例如 0x4a 或 0x56 或任何字节。甚至它们的组合,如 0x4a56。此外,如果说有一些字节的 5 个最高有效位相同,而低 3 个位从 000 到 111 不等,那么这也形成了一个模式,因为 5 位在多个位置是相同的。这是我能想到的可能模式。仍然可能你可以想到更多这样的模式,我唯一想要的是它们应该很容易区分。
  • 这通常是不可能的,因为几乎任何东西都可以是一种模式。你想用这个做什么?也许还有更具体的问题?
  • 为什么是十六进制?您是否搜索在 4 位边界上对齐的模式?
  • @templatetypedef 它被称为机器学习。你听说过吗?

标签: artificial-intelligence machine-learning data-mining text-mining pattern-recognition


【解决方案1】:

这似乎是一个非常典型的 ngram 查找问题。这是一些 ngram 解决方案的链接。

quicker way to detect n-grams in a string?

你应该像对待任何其他字符串一样对待你的十六进制。

【讨论】:

    【解决方案2】:

    您可以在流上训练Markov Models 甚至隐藏马尔可夫模型,并使用这些模型来确定最有可能属于哪个流的新数据。据说有数十个库可以在您选择的编程语言中执行此操作。

    也许从读一本书开始。我建议 C. Bishop 的 Pattern Recognition

    【讨论】:

    • 你能告诉我可用的库吗?我在linux上使用c。或者您可以告诉我可用于其他平台的库。谢谢。
    【解决方案3】:

    这是另一个想法。它是否适合您取决于您​​正在处理的数据量、可以使用的内存量以及它检测到的模式类型是否最终对您的目的有用。

    考虑到所有这些条件,您可能想尝试使用后缀树后缀数组。特别是对于后缀树,有一些算法可以让您在将字符附加到文本时不断更新树(所谓的在线后缀树构造),最著名的是 Ukkonen 算法。这在使用数据流(与固定长度、完全定义的输入文本相反)时可能特别有效。

    后缀树(以及类似的后缀数组)表示文本的所有后缀(在字符串结尾的意义上,而不是语言后缀)。因此,它特别适用于(a)检查任何给定字符串是否是文本的子字符串,以及(b)检测文本中的重复子字符串。通过在正确的地方进行一些修改,它可以用来检测重复的子字符串有轻微的变化(就像你的例子中的一个重复的模式,中间交换了一个字符)。

    对于这些数据结构的全面介绍,如果您可以访问大学图书馆或有钱,Dan Gusfield's introduction to algorithms on strings, trees and sequences 将非常有帮助。但是在 SO 上也有很多与此相关的问题和答案。

    如果在进一步阅读之后,您认为值得一试,我可以进一步详细说明我认为后缀树可以如何用于您的目的,以回答一个新问题,特别是关于使用这些算法进行重复模式检测。

    【讨论】:

    • 感谢@jogojapan 的回答。我会在这件事上回复你。在此之前我需要做一些阅读。
    【解决方案4】:

    您的问题尚未完全定义,但我会尝试给您一些指示:

    1. 您的模式可能可以表达为正则表达式。如果你不知道这些是什么——我会尝试用你最喜欢的编程语言寻找一个具体的例子。 Python 是一个不错的选择(re 模块包含在核心语言中)。对于 C++,使用 boost::regex,对于其他语言,使用 google :)

    2. 现在 - 要使用正则表达式搜索二进制文件(十六进制)而不是文本,请尝试查看 this 之类的内容。

    祝你好运:)

    【讨论】:

    • 我已经在上面详细解释了我的问题。如果我现在很清楚,请告诉我,也可能是我上面问题的答案。谢谢
    猜你喜欢
    • 1970-01-01
    • 2013-10-19
    • 2017-02-18
    • 1970-01-01
    • 2012-07-24
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    相关资源
    最近更新 更多