【问题标题】:How to extract bitarray from its byte representation of the bitarray in original format如何从原始格式的位数组的字节表示中提取位数组
【发布时间】:2017-09-28 09:32:05
【问题描述】:

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

【问题讨论】:

  • 亲爱的 SO,请不要再问“最有效”的方法了。谢谢。
  • 如何克服?它们不一样。您可能需要指定您要完成的任务。
  • 如果它们的长度不同,它们怎么可能相等?
  • 打印出来,你会看到。您正在对 bitarray 包做出假设。

标签: python bitarray


【解决方案1】:

如果是来自https://pypi.python.org/pypi/bitarray/的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-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])永远不会发生。

【讨论】:

    猜你喜欢
    • 2017-03-02
    • 2020-01-03
    • 1970-01-01
    • 2012-05-20
    • 2016-01-15
    • 1970-01-01
    • 2013-05-08
    • 2019-12-13
    • 1970-01-01
    相关资源
    最近更新 更多