如何从原始格式的bitarray的字节表示中提取bitarray

时间:2017-04-30 20:43:50

标签: python bitarray

对于以下代码,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 个答案:

答案 0 :(得分:1)

如果是来自https://pypi.python.org/pypi/bitarray/

的比特币0.8
  • tobytes不保留位长度
  • 因此frombytes总是创建一个长度= n * 8
  • 的比特

变通方法

  • 最无痛的解决方法是将两个数组的大小扩展到8的倍数。没有这样的操作
  • 第二个最无痛的解决方法是在比较之前在两个阵列上运行tobytes-frombytes对。这样他们的长度将成为8
  • 的倍数
  • 或者unpack和pack可能保留确切的长度,只需使用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]))

在我的想象中,通过运行这些行,较短的比特阵列以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])永远不会发生。