2016-04-23 1 views
3

J'essaie de trouver des octets spécifiques dans un fichier chargé en tant que ConstBitStream:Comment trouver des données binaires dans ConstBitStream à partir d'un décalage donné?

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

Cela fonctionne très bien pour la première occurrence. Après avoir trouvé la première séquence, je veux trouver le prochain en utilisant la méthode find à nouveau, mais à partir d'un décalage maintenant:

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

Cela ne semble pas fonctionner. Je reçois toujours la position de la première occurrence de ma séquence binaire.

Qu'est-ce qui ne va pas?


UPDATE:

(valeurs de premier found et s.bytepos):

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

(valeurs de deuxième found et s.bytepos):

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

Il semble que la mise en start=s.bytepos n'a pas n'importe quel effet.

+1

Pouvez-vous imprimer les valeurs de 'found' (la première valeur) et' s.bytepos'? –

+0

N'utilisez pas 's.bytepos' comme valeur pour l'argument' start', utilisez plutôt 's.pos'. – user2683246

+0

Assurez-vous que 'my_offset' compte les octets, pas les bits. Sachez que la valeur 'found' est un tuple avec un décalage de bit, pas un décalage d'octet. – user2683246

Répondre

0

Le paramètre start est la position du bit pour démarrer la recherche, pas la position de l'octet. Pour obtenir l'occurrence suivante, vous devez utiliser start=s.bitpos + 1.

Une autre chose à noter est que si vous utilisez bytealigned=False (ce qui est la valeur par défaut), alors vous ne pouvez pas utiliser en général, même s.bytepos après que la position actuelle pourrait ne pas être aligné octet (il soulèvera un ByteAlignError). Les chances sont que vous voulez bytealigned=True, qui est aussi un peu juste plus rapide.

Notez également que vous pouvez simplement utiliser

g = s.findall('0x4140') 

qui retourne un générateur qui donne toutes les positions sans avoir à faire plusieurs appels find (pour les obtenir à la fois il suffit d'utiliser de façon répétée ou g.next()list(g)).