将带有 0 和 1 的列表转换为位数组(使用位数组模块)并输出到二进制文件错误



我有一个独特的问题(至少据我所知,我在这里花在SO和谷歌搜索上的时间)。

我有一个列表长度不同的 0 和 1 整数的列表,例如:

[0, 1, 0, 0 ,1, 0, 0, 0, 0, 0, 0...]

我正在将此列表转换为bitarray,如下所示:

from bitarray import bitarray
def binWise(sequence):
   newseq = bitarray(sequence)
   return newseq

这将返回以下格式的二进制输出:

b'01001000001'

但是,当我尝试将其直接作为二进制写入文件时,我得到

TypeError: 'bitarray' does not support the buffer interface

有没有办法将二进制数据直接输出到二进制文件?我根本不介意第三方模块建议。但越简单越好。

您需要使用以下方法之一来生成bytesstr字符串对象:

  • .to01()生成一串'0''1'字符。
  • .tobytes()生成一个 bytes 对象,每个 8 位(一个字节)序列转换为bytes序列中的一个字节。bitarray填充为长度的 8 的倍数。
  • .tofile(f)bitarray信息写入文件(在二进制模式下),再次填充为 8 的倍数的长度。

要将零和一打包成二进制按位格式,可以使用 numpy 的packbits

>>> import numpy as np
>>> x = np.packbits([1, 0, 0, 0 , 0, 0, 0, 1])
>>> x
array([129], dtype=uint8)

uint8 表示 numpy 将数据中的每个字节显示为无符号整数。

此数组可以写入文件:

>>> with open('output.dat', 'wb') as f:
...    f.write(x)
... 

Packbits会根据需要将您的数据打包成任意数量的字节。 甚至不是 8 长的多路复用数据,可以轻松处理:

>>> x = np.packbits([1, 0, 0, 0 , 0, 0, 0, 1, 1, 1])
>>> x
array([129, 192], dtype=uint8)

如您所见,第九位和第十位,1, 1,放在从"高"位开始的第二个字节中。

相关内容

  • 没有找到相关文章

最新更新