2017-04-30 14 views
0

aおよびcのコードの場合、次のコードは比較できません。論理的には同じですが。ビット配列の元の形式のバイト配列からビット配列を抽出する方法

ここで、aは、長さが異なるため、cと等しくありません。この問題を効率的に克服するにはどうすればよいですか?

from bitarray import bitarray 

a = bitarray('1', endian="little") * 5 
b = a.tobytes() 
c = bitarray(endian='little') 
c.frombytes(b) 

print(a == c) 
+1

親愛なる、「最も効率的な」方法を尋ねる人々を止めてください。ありがとうございました。 –

+1

どのように克服?それらは違う。達成しようとしていることを特定する必要があります。 –

+0

長さが異なる場合、どうやってそれらは等しくなりますか? – martineau

答えて

1

はfrombytesは常に長さ= N * 8

のbitarrayを作成

  • したがってビットの長さを保持しないhttps://pypi.python.org/pypi/bitarray/

    • tobytesからbitarray 0.8の場合回避策

      • 最も簡単な回避策は、両方のアレイのサイズを8の倍数に拡張することです。そのような操作はありません。
      • 2番目の最も簡単な回避策は比較の前に両方のアレイでtobytes-frombytesペアを実行しています。この方法では、その長さは、あるいは、おそらく彼らは私の知る限り、現在の実装が常にあることを想定して確認して1ビット

      を表現するための1つのバイトを使用し、正確な長さを維持解凍し、パック8

    • の倍数となります2つのビット配列の長さが異なる場合、その内容は異なります。 bitdiffでさえそのようなチェックから始まりますが、短い配列はそのような比較のために0-sで事実上拡張されると仮定できます。

      EDIT: インプレース拡張が可能です。それは素敵なPythonコードであるかどうかはわかりませんが、このようなものは動作可能性があります私の想像で

      a.extend(max(0, c.length()-a.length()) * bitarray([False])) 
      c.extend(max(0, a.length()-c.length()) * bitarray([False])) 
      

      短いbitarrayが0-Sで拡張に等しい長さを持っていますこれらの行を実行することにより、他のビット配列。実際には私は0*bitarray([False])がどう振る舞い、それを今テストすることができないのか分かりません。それが正常に機能しない場合は は、伝統的な

      if c.length()<a.length(): c.extend(a.length()-c.length()) * bitarray([False]) 
      elif a.length()<c.length(): a.extend(c.length()-a.length()) * bitarray([False]) 
      

      0*bitarray([False])が発生しないことを確実にすることができます。

  • 関連する問題