2014-10-01 5 views
2

у меня есть некоторые большие двоичные файлы, которые я должен искать определенные последовательности байтов в пределах, например:найти ByteArray в ByteArray с групповыми символами

find_bytes = bytearray(base64.b16decode('a226fb42')) 
with open(filename, "rb") as f: 
    file_bytes = bytearray(f.read()) 
    found_pos = file_bytes.find(find_bytes, 0) 

Это прекрасно работает, только теперь я хочу, чтобы иметь возможность обозначить конкретный (например, 00 или FF) в последовательности в качестве подстановочного знака, который будет соответствовать любому байту, поэтому a2000042 должен соответствовать любой последовательности из 4 байтов, начиная с a2 и заканчивая 42.

Есть ли способ расширить метод find, чтобы сделать это, или лучшее решение?

Использование Python 2.7, но готов перейти в случае необходимости ..

ответ

4

Вы можете использовать регулярное выражение (они работают на ByteArray,):

>>> import re 
>>> bytes = bytearray('\x01\x02\x03\x04\x05') 
>>> re.search(b'\x02.\x04',bytes).group(0) 
'\x02\x03\x04' 

Просто используйте '' как символ подстановки.

Может возникнуть проблема с очень большими файлами, так как весь файл необходимо сначала загрузить в строку.

+0

Так что это довольно хорошо, не знаю, регулярные выражения могут работать на bytearrays. Я попробую и испытаю производительность. – snowcrash09

+0

Файлы ~ 1 ГБ, а производительность не заметно хуже, чем без регулярного выражения. Благодаря! – snowcrash09