Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在hextump上查找重复模式?_Python_Design Patterns - Fatal编程技术网

Python 如何在hextump上查找重复模式?

Python 如何在hextump上查找重复模式?,python,design-patterns,Python,Design Patterns,我需要从hextump输出中找到重复出现的模式。 输出文件中的每一行都类似于: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 其中00是十六进制的字节 这些图案不是固定长度的,但它们总是在一条线上 我对如何做到这一点有一个想法,但我想知道你认为最有效的方法是什么,比如如果有某种已知的算法我不知道 我还想用Python编写这个代码 非常感谢您的任何建议:) 谢谢 编辑: 我需要在磁盘转储中找到分区引导扇区。问题是文件系统并不常见,所以我需要扫描h

我需要从hextump输出中找到重复出现的模式。 输出文件中的每一行都类似于:

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
其中
00
是十六进制的字节

这些图案不是固定长度的,但它们总是在一条线上

我对如何做到这一点有一个想法,但我想知道你认为最有效的方法是什么,比如如果有某种已知的算法我不知道

我还想用Python编写这个代码

非常感谢您的任何建议:)

谢谢

编辑: 我需要在磁盘转储中找到分区引导扇区。问题是文件系统并不常见,所以我需要扫描hextump以找到经常使用的模式,从而限制研究领域

例如,我正在寻找如下字节模式:

00 56 f0 43 d0 

不清楚您是否知道要搜索的子字符串,或者是否需要首先发现一组查询子字符串。我认为发现可以通过发现频繁出现的n-gram来实现。一旦有了查询子字符串集,就可以继续查找它们所在的位置以及它们之间的距离(例如,如果每1024字节出现一个子字符串,则可能是块大小)

步骤1:读取hextump文件并将其转换回单个字符串。细节由你决定

步骤2:对于n的每个有趣值(例如3、4、5(如您的示例),6等),使用以下函数:

from collections import Counter # needs 2.7
from operator import itemgetter
def get_ngrams(strg, n, top=10, min_count=2):
    counter = Counter()
    for i in xrange(len(strg) - n + 1):
        gram = strg[i:i+n]
        counter[gram] += 1
    sort_these = [(gram, count) for gram, count in counter.iteritems() if count >= min_count]
    best = sorted(sort_these, key=itemgetter(1), reverse=True)[:top]
    return best
这将为您提供最频繁出现的子字符串

步骤3:出现这些字符串的位置:

def multifind(strg, gram):
    positions = []
    end = len(strg)
    pos = 0
    while pos < end:
        pos = strg.find(gram, pos)
        if pos == -1:
            break
        positions.append(pos)
        pos += 1
    return positions

不清楚您是否知道要搜索的子字符串,或者是否需要首先发现一组查询子字符串。我认为发现可以通过发现频繁出现的n-gram来实现。一旦有了查询子字符串集,就可以继续查找它们所在的位置以及它们之间的距离(例如,如果每1024字节出现一个子字符串,则可能是块大小)

步骤1:读取hextump文件并将其转换回单个字符串。细节由你决定

步骤2:对于n的每个有趣值(例如3、4、5(如您的示例),6等),使用以下函数:

from collections import Counter # needs 2.7
from operator import itemgetter
def get_ngrams(strg, n, top=10, min_count=2):
    counter = Counter()
    for i in xrange(len(strg) - n + 1):
        gram = strg[i:i+n]
        counter[gram] += 1
    sort_these = [(gram, count) for gram, count in counter.iteritems() if count >= min_count]
    best = sorted(sort_these, key=itemgetter(1), reverse=True)[:top]
    return best
这将为您提供最频繁出现的子字符串

步骤3:出现这些字符串的位置:

def multifind(strg, gram):
    positions = []
    end = len(strg)
    pos = 0
    while pos < end:
        pos = strg.find(gram, pos)
        if pos == -1:
            break
        positions.append(pos)
        pos += 1
    return positions

你能提供一些你想要识别的模式的例子吗?你能提供一些你想要识别的模式的例子吗?