pythonbitstringbitstream

How to find binary data within ConstBitStream starting from a given offset?


I'm trying to find specific bytes within a file loaded as ConstBitStream:

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

This is working fine for the first occurrence. After finding the first sequence, I want to find the next one by using the find method again but starting from an offset now:

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

This doesn't seem to work. I'm always getting the position from the first occurrence of my binary sequence.

What's wrong?


UPDATE:

(values of first found and s.bytepos):

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

(values of second found and s.bytepos):

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

It seems that setting start=s.bytepos does not have any effect.


Solution

  • The start parameter is the bit position to start the search, not the byte position. To get the next occurrence you need to use start=s.bitpos + 1.

    Another thing to note is that if you use bytealigned=False (which is the default) then you can't in general even use s.bytepos afterwards as the current position might not be byte aligned (it will raise a ByteAlignError). Chances are you want bytealigned=True, which is also a fair bit faster.

    Also note you can just use

    g = s.findall('0x4140')
    

    which returns a generator that gives all the positions without having to do multiple find calls (just use g.next() repeatedly or list(g) to get them all at once).