如何从原始格式的位数组的字节表示中提取位数组
How to extract bitarray from its byte representation of the bitarray in original format
对于下面的代码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)
如果是来自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])
永远不会发生。
对于下面的代码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)
如果是来自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])
永远不会发生。