Python 如何在hextump上查找重复模式?
我需要从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
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
你能提供一些你想要识别的模式的例子吗?你能提供一些你想要识别的模式的例子吗?