2014-12-29 5 views
2

Я пытаюсь выполнить поиск двоичного файла для ряда шестнадцатеричных значений, однако я столкнулся с несколькими проблемами, которые я не могу решить. (1) Я не уверен, как искать весь файл и возвращать все совпадения. В настоящее время у меня есть f.seek, если только я думаю, что это может быть, и это не хорошо. (2) Я хотел бы вернуть смещение в десятичном или шестнадцатеричном формате, где может быть совпадение, хотя я получаю 0 каждый раз, поэтому я не уверен, что я сделал не так.Python regex search for hexidecimal bytes

example.bin

AA BB CC DD EE FF AB AC AD AE AF BA BB BC BD BE 
BF CA CB CC CD CE CF DA DB DC DD DE DF EA EB EC 

код:

# coding: utf-8 
import struct 
import re 

with open("example.bin", "rb") as f: 
    f.seek(30) 
    num, = struct.unpack(">H", f.read(2)) 
hexaPattern = re.compile(r'(0xebec)?') 
m = re.search(hexaPattern, hex(num)) 
if m: 
    print "found a match:", m.group(1) 
    print " match offset:", m.start() 

Может быть, есть лучший способ сделать это? Заранее спасибо.

+0

насколько большой файл? – Urban48

+0

Файл может иметь размер от 100 КБ до 10 МБ. – DIF

ответ

2
  1. Я не знаю, как найти весь файл и вернуть все матчи.
  2. Я хотел бы вернуть смещение в десятичном или шестнадцатеричном
import re 

f = open('data.txt', 'wb') 
f.write('\xAA\xBB\xEB\xEC') 
f.write('\xAA\xBB\xEB\xEC') 
f.write('\xAA\xBB\xEB\xEC') 
f.write('\xAA\xBB\xEB\xEC') 
f.write('\xAA\xBB\xEB\xEC') 
f.write('\xAA\xBB\xEB\xEC') 
f.write('\xAA\xBB\xEB\xEC') 
f.close() 

f = open('data.txt', 'rb') 
data = f.read() 
f.close() 

pattern = "\xEB\xEC" 
regex = re.compile(pattern) 

for match_obj in regex.finditer(data): 
    offset = match_obj.start() 
    print "decimal: {}".format(offset) 
    print "hex(): " + hex(offset) 
    print 'formatted hex: {:02X} \n'.format(offset) 

--output:-- 
decimal: 2 
hex(): 0x2 
formatted hex: 02 

decimal: 6 
hex(): 0x6 
formatted hex: 06 

decimal: 10 
hex(): 0xa 
formatted hex: 0A 

decimal: 14 
hex(): 0xe 
formatted hex: 0E 

decimal: 18 
hex(): 0x12 
formatted hex: 12 

decimal: 22 
hex(): 0x16 
formatted hex: 16 

decimal: 26 
hex(): 0x1a 
formatted hex: 1A 

Позиции в основе индексации использование файла 0 как список.

e.finditer (шаблон, строка, флаги = 0)
Возврат итератор получая экземпляры MatchObject над всеми неперекрывающимися совпадениями для шаблона RE в строке. Строка проверяется слева направо, а совпадения возвращаются в указанном порядке.

матча объекты поддержки следующие методы и атрибуты:
старта ([группа])
конца ([группа])
Возврат индексы начала и конца подцепочки, найденная группа; (по умолчанию полностью соответствует подстроке).

https://docs.python.org/2/library/re.html

+0

приятно, что хорошо работает. спасибо за объяснение, очень полезно! – DIF

+0

@DIF. Если вы не хотите «0x» перед шестнадцатеричной строкой смещения, вы можете использовать format(): 'print '{: 02X}'. Format (offset)' (также создает две цифры для всех шестнадцатеричные коды). – 7stud

0

попробовать

import re 

with open("example.bin", "rb") as f: 
    f1 = re.search(b'\xEB\xEC', f.read()) 

print "found a match:", f1 .group() 
print " match offset:", f1 .start() 
+0

спасибо, это почти идеально. есть ли способ сделать отображение f1.group() шестнадцатеричным? – DIF

+0

@DIF, см. Мой ответ. – 7stud

 Смежные вопросы

  • Нет связанных вопросов^_^