如何对大文本文件运行字典搜索?

时间:2009-05-31 15:27:44

标签: c++ regex string grep

我们正处于运送控制台游戏的最后阶段。在Wii上我们当然遇到了大部分内存问题,因此我们正在忙着寻找邋code的编码,打包等等。

我已经完成了内存转储,并使用strings.exe(来自sysinternals)来分析它,但它会产生很多像这样的垃圾:

''''$$$$    %%%%
''''$$$$%%%%####&&&&
''''$$$$((((!!!!$$$$''''((((####%%%%$$$$####((((
''))++.-$$%&''))
'')*>BZf8<S]^kgu[faniwkzgukzkzkz
'',,..EDCCEEONNL

我对这样的字符串更感兴趣:

wood_wide_end.bmp
restroom_stonewall.bmp

...这意味着我们仍然要嵌入某些需要转换为ID的字符串。

所以我的问题是:有哪些好的方法可以找到我们可以消除的调试数据?

我可以做一些rx来破解符号或只搜索某些类型的字符串。但我真正想做的是获取一个标准的字典文件并搜索我的字符串文件。如果我用aardvaark | alimony | archetype等构建一个大的rx,似乎很慢。或者如果我为它编写一个.NET编译的rx程序集,它会运行得好吗?

寻找关于如何找到我们想要消除的东西的其他想法。快速而肮脏的解决方案,不需要优雅。谢谢!

2 个答案:

答案 0 :(得分:1)

首先,我会得到一个好的单词列表。 This NPL page有很多不同大小和来源的单词列表。我要做的是构建一个单词列表中所有单词的哈希表,然后测试strings对单词列表输出的每个单词。这在Python中很容易实现:

import sys

dictfile = open('your-word-list')
wordlist = frozenset(word.strip() for word in dictfile)
dictfile.close()

for line in sys.stdin:
    # if any word in the line is in our list, print out the whole line
    for word in line.split():
        if word in wordlist:
            print line
            break

然后像这样使用它:

strings myexecutable.elf | python myscript.py

然而,我认为你把注意力集中在错误的地方。消除调试字符串的回报非常低。虽然消除调试数据是任天堂要求你做的技术认证要求,但我认为他们不会因为你的ELF中有一些额外的字符串而反弹你。

使用分析器并尝试识别您使用最多内存的位置。如果你把精力集中在正确的地方,可能会有一种方法可以节省大量的内存。

答案 1 :(得分:0)

对于支持正则表达式的东西来说,这听起来像是一个快速而肮脏的脚本的理想任务。如果是我的话,我可能会在python中快速做一些事情。

以下是我将如何进行: 每次遇到字符串(来自strings.exe输出)时,都会提示用户是否要在字典中记住它或永久忽略它。如果用户选择永久忽略该字符串,将来遇到该字符串时,不要提示用户将其丢弃并丢弃。您可以选择保留一个反字典文件,以便在将来运行脚本时记住这一点。构建字典文件,并为每个字符串保留一个计数或任何其他关于它的信息。可选择按字符串出现的次数排序,这样您就可以专注于最恶劣的违规者。

这听起来像是学习脚本语言的理想任务。我不打扰乱用C#/ C ++或任何真正想要实现它的东西。