如何从比特数组的字节表示中提取原始格式的比特数组
对于下面的代码,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
如果你在使用的是来自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])
不会出现。