2016-04-23 22 views
3

私はConstBitStreamとしてロードされたファイル内の特定のバイトを見つけようとしている:ConstBitStream内のバイナリデータを特定のオフセットから検索するにはどうすればよいですか?

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

これが最初に出現したため正常に動作しています。これは動作していないよう

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

:最初のシーケンスを見つけた後、私は再びfindメソッドを使用しますが、今のオフセットから開始して、次のいずれかを見つけたいです。私はバイナリシーケンスの最初の出現から常にポジションを得ています。

どういうところが間違っていますか?


UPDATE:

(第founds.byteposの値):

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

(第founds.byteposの値):

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

start=s.byteposを設定すると思われます持っていない任意の効果。

+1

'found'(最初の値)と' s.bytepos'の値を出力できますか? –

+0

'start'引数の値として' s.bytepos'を使用しないでください。代わりに 's.pos'を使用してください。 – user2683246

+0

'my_offset'はビットではなくバイトであることを確認してください。 'found'値はバイトオフセットではなくビットオフセットを持つタプルであることに注意してください。 – user2683246

答えて

0

startパラメータは、バイト位置ではなく、検索を開始するビット位置です。次の出現を得るには、start=s.bitpos + 1を使用する必要があります。注意すべき

もう一つは、あなたが(デフォルトで)bytealigned=Falseを使用した場合、現在位置がバイト整列(それはByteAlignErrorが発生します)ではないかもしれないとして、あなたは一般的にも、その後s.bytepos使用できないことです。あなたはbytealigned=Trueが好きです。これはやはりかなり速いです。

はまた、あなただけの複数のfindのコールを(一度だけでそれらすべてを取得するために繰り返しg.next()またはlist(g)を使用)を実行することなく、すべてのポジションを与えて発電を返し

g = s.findall('0x4140') 

を使用することができます注意してください。

関連する問題