2015-08-11 2 views
0

strings - это приложение GNU/Linux, которое печатает строки печатных символов в файлах.Python: Обнаруживать все строки в двоичном файле?

Есть ли способ сделать то, что strings делает, но в Python?

Вызов strings и захват вывода в моем случае не является вариантом.

+0

возможно дубликат [эквивалент Python утилиты unix «strings»] (http://stackoverflow.com/questions/17195924/python-equivalent-of-unix-strings-utility) – mplf

ответ

1

Проверьте байт по байту, чтобы увидеть, выпадает ли он между 0x20 и 0x7F. Это должно печатать, если байт является читаемым символом ASCII.

+0

А как насчет символов Unicode? – mfcabrera

1

, если вы не заботитесь о содержании продукции, это очень легко достичь, если вы просто игнорировать все ошибки декодирования:

в python2:

with open('file') as fd: 
    print fd.read().decode('ascii', errors='ignore') 

в Python3:

import codecs 
with open('file') as fd: 
    print(codecs.decode(fd.read(), 'ascii', errors='ignore')) 

в любом случае, errors='ignore' просто игнорирует все ошибки во время декодирования.

далее ссылка: https://docs.python.org/2/library/codecs.html

python3: https://docs.python.org/3.5/library/codecs.html

0

Следующая напечатает список всех слов длины 4 или более:

import re 

with open(r"my_binary_file", "rb") as f_binary: 
    print re.findall("([a-zA-Z]{4,})", f_binary.read()) 

Делая это, он режет вниз на некоторых нетекстовые матчи, но, возможно, пропустите что-то, что искали. strings также имеет значение по умолчанию 4.

0

Ниже следует найти все строки длины 4 и более (что strings делает по умолчанию) в массиве байт:

def strings(data): 
    cleansed = "".join(map(lambda byte: byte if byte >= chr(0x20) and byte <= chr(0x7F) else chr(0), data)) 
    return filter(lambda string: len(string) >= 4, cleansed.split(chr(0))) 
Смежные вопросы