我正在尝试编写一个脚本,该脚本将从可执行二进制文件中提取字符串并将其保存在文件中。将此文件换行换行不是一种选择,因为字符串本身可能有换行符。但是,这也意味着使用unix“strings”实用程序不是一个选项,因为它只打印出所有新行分隔的字符串,这意味着只能通过查看输出来判断哪些字符串包含换行符。 “弦”。因此,我希望找到一个python函数或库来实现“strings”的相同功能,但是它会将这些字符串作为变量给我,以便我可以避免换行问题。
谢谢!
答案 0 :(得分:16)
这是一个生成器,它在min
中找到所有可打印字符的字符串> = filename
(默认为4),其长度为import string
def strings(filename, min=4):
with open(filename, errors="ignore") as f: # Python 3.x
# with open(filename, "rb") as f: # Python 2.x
result = ""
for c in f.read():
if c in string.printable:
result += c
continue
if len(result) >= min:
yield result
result = ""
if len(result) >= min: # catch result at EOF
yield result
:
for s in strings("something.bin"):
# do something with s
你可以迭代:
sl = list(strings("something.bin"))
...或存储在列表中:
strings
我对此进行了非常简单的测试,它似乎为我选择的任意二进制文件提供了与Unix strings
命令相同的输出。但是,它非常天真(一开始,它会立即将整个文件读入内存,这对于大型文件来说可能很昂贵),并且不太可能接近Unix {{1}}命令的性能。
答案 1 :(得分:3)
引用man strings
:
STRINGS(1) GNU Development Tools STRINGS(1) NAME strings - print the strings of printable characters in files. [...] DESCRIPTION For each file given, GNU strings prints the printable character sequences that are at least 4 characters long (or the number given with the options below) and are followed by an unprintable character. By default, it only prints the strings from the initialized and loaded sections of object files; for other types of files, it prints the strings from the whole file.
您可以使用regex
匹配至少4个可打印字符来获得类似的结果。这样的事情:
>>> import re
>>> content = "hello,\x02World\x88!"
>>> re.findall("[^\x00-\x1F\x7F-\xFF]{4,}", content)
['hello,', 'World']
请注意,此解决方案需要将整个文件内容加载到内存中。
答案 2 :(得分:-3)
您可以使用csv包来管理字符串中的新行。你只需要一列。