2016-04-23 8 views
3

Я пытаюсь найти конкретные байты внутри файла, загруженного в ConstBitStream:Как найти двоичные данные в ConstBitStream, начиная с заданного смещения?

s = ConstBitStream(filename=myFile) 
found = s.find('0x4140', bytealigned=False) 

Это работает отлично для первого появления. После обнаружения первой последовательности, я хочу найти следующий с помощью метода find снова, но исходя из смещения в настоящее время:

s.bytepos = position_after_the_first_occurrence + my_offset 
found = s.find('0x4140', start=s.bytepos, bytealigned=False) 

Это не похоже на работу. Я всегда получаю позицию от первого появления моей двоичной последовательности.

Что случилось?


ОБНОВЛЕНИЕ:

(значения первого found и s.bytepos):

found = {tuple} (54784,) 
s.bytepos = {int} 6848 

(значения второго found и s.bytepos):

s.bytepos = {int} 32969 
found = {tuple} (54784,) 

Кажется, что установка start=s.bytepos не имеет любой эффект.

+1

Вы можете распечатать значения 'found' (первое значение) и' s.bytepos'? –

+0

Не используйте 's.bytepos' в качестве значения для аргумента' start', вместо этого используйте 's.pos'. – user2683246

+0

Убедитесь, что 'my_offset' подсчитывает байты, а не бит. Имейте в виду, что значение 'found' является кортежем с битовым смещением, а не смещением байта. – user2683246

ответ

0

Параметр start - это позиция бит для начала поиска, а не позиция байта. Чтобы получить следующее появление, вам нужно использовать start=s.bitpos + 1.

Другого дело, следует отметить, что если вы используете bytealigned=False (который по умолчанию), то вы не можете вообще даже использовать s.bytepos потом как текущее положение может не быть байт выровненных (это поднимет ByteAlignError). Скорее всего, вы хотите bytealigned=True, что также справедливо бит быстрее.

Также обратите внимание, что вы можете просто использовать

g = s.findall('0x4140') 

, который возвращает генератор, который дает все позиции без необходимости делать многократные find звонки (просто использовать g.next() повторно или list(g), чтобы получить их все сразу).