如何从原始格式的位数组的字节表示中提取位数组

How to extract bitarray from its byte representation of the bitarray in original format

对于下面的代码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)

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

的位数组0.8
  • tobytes 不保留位长度
  • 因此 frombytes 总是创建一个长度为 n*8
  • 的位数组

解决方法

  • 最轻松的解决方法是将两个数组的大小扩展到 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]))

在我的想象中,通过 运行 这些行,较短的位数组被扩展为 0,并且与另一个位数组的长度相等。实际上,我不知道 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])永远不会发生。