2015-04-11 3 views
1

Я хочу подсчитать вхождения определенного раздела заголовка в двоичном файле с Python 2.7.3. Я нашел множество примеров для подсчета вхождений в файлах типа .txt и для строк, но мало информации о подсчете байтовых последовательностей в двоичных файлах.количество вхождений в двоичном файле Python 2X

Мысли, вы должны использовать символы ASCII в двоичном формате, чтобы использовать строку для поиска.

Секция заголовка в шестнадцатеричном виде равна "28 00 28 00 28 00" или "(((" в ascii.

Я думал, что код будет выглядеть примерно так:

total = 0 
for line in f: 
    if "(((" in line: 
     total += 1 
f.close() 
print "%s" % total 

Но это даже не кажется, сосчитать один раз, он будет печатать строку и длиной 120 символов.

ответ

1

У вас есть NULL байт, а не пробелы. Используя '(((', вы ищете 28 20 28 20 28 20, а не 28 00 28 00 28 00.

Используйте \x00 создать такие байты:

if "(\x00(\x00(\x00" in line: 

зацикливания через двоичный файл в линий не имеет смысла; это будет работать, только если в этом файле было \n байт.

Вы можете искать через файл в куски, а не строки:

previous = '' 
total = 0 
for chunk in iter(lambda: f.read(2048), ''): 
    if "(\x00(\x00(\x00" in previous + chunk: 
     total += 1 
    previous = chunk[-5:] # ensure we don't miss matches at boundaries 
+0

Спасибо за то, новобранец ошибки, с обновленной IF заявление общее количество по-прежнему 0. Would байт лучше, чем использовать, чем " строк "в заявлении FOR? –

+0

@Python_newbie: так вы на 100% уверены, что эти байтовые последовательности есть? Для двоичных файлов я читал куски (и беру последние 5 байтов из предыдущего фрагмента для следующего теста, чтобы убедиться, что вы не пропустили частичное совпадение). –

+0

Да, конечно, я могу найти каждый экземпляр заголовка в критерии поиска «Найти выбор» в Hex Editor. Есть угадай 1000 х 3 разных типа заголовков, поэтому я хочу, чтобы скрипт подсчитывал и печатал подтвержденную сумму. Чтение в кусках не будет работать, поскольку метаданные могут различаться по длине, поэтому поиск последовательности байтов заголовка является лучшим вариантом afaik. –