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

0 投票
1 回答
1085 浏览
提问于 2025-05-16 19:50

对于下面的代码,ac 是无法进行比较的。尽管它们在逻辑上是相同的。

这里,ac 不相等是因为它们的长度不同?有什么有效的方法可以解决这个问题吗?

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

如果你在使用的是来自https://pypi.python.org/pypi/bitarray/的bitarray 0.8版本,

  • tobytes这个功能不会保留比特的长度。
  • 因此,frombytes总是会创建一个长度为n*8的bitarray。

解决方法

  • 最简单的解决方法是把两个数组的大小都扩展到8的倍数。可是没有这样的操作。
  • 第二个简单的解决方法是在比较之前,先对两个数组都运行一次tobytes和frombytes。这样它们的长度就会变成8的倍数。
  • 另外,解包和打包可能会保留确切的长度,只是它们用1个字节来表示1个比特。

根据我检查的情况,当前的实现总是认为如果两个bitarray的长度不同,它们的内容就是不同的。即使是bitdiff在开始时也会进行这样的检查,虽然我们可以假设较短的数组在比较时实际上是用0来扩展的。

编辑: 就地扩展可能是可行的。我不能确定这是否是好的Python代码,但类似这样的代码可能有效:

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

在我想象中,运行这些代码后,较短的bitarray会用0扩展,并与另一个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])不会出现。

撰写回答