2017-04-30 40 views
0

對於以下代碼ac是不可比較的。儘管它們在邏輯上是相同的。如何從原始格式的比特數組的字節表示中提取比特數

這裏,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

親愛的SO,請停止詢問「最高效」方式的人。謝謝。 –

+1

克服它如何?他們是不同的。您可能需要指定您正在嘗試完成的內容。 –

+0

如果它們的長度不同,它們會如何相等? – martineau

回答

1

如果它是從https://pypi.python.org/pypi/bitarray/

  • tobytes的bitarray 0.8不保留在比特長度
  • 因此frombytes總是創建長度= N * 8

的bitarray解決方法

  • 最無痛的解決方法是將兩個陣列的大小擴展到8的倍數。沒有這樣的操作
  • 第二個最無痛的解決方法是在比較之前在兩個陣列上運行tobytes-frombytes對。這樣,它們的長度將成爲8
  • 或者多解包和包可能保持精確長度,只是他們使用1個字節來表示據1位

爲我檢查當前的實現總是假設如果它們的長度不同,則兩個比特的內容是不同的。即使bitdiff從這種檢查開始,而人們可以假設較短的陣列實際上用0-s進行擴展來進行這種比較。編號: 就地擴展可能是可能的。我不知道,如果它是很好的Python代碼或沒有,但這樣的事情可能工作:

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

在我的想象通過運行這些線路較短bitarray獲取與0-S延伸,具有長度相等的其他bitarray。在實踐中,我不知道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])永遠不會發生。