我有一个独特的问题(至少据我所知,我在这里花在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
有没有办法将二进制数据直接输出到二进制文件?我根本不介意第三方模块建议。但越简单越好。
您需要使用以下方法之一来生成bytes
或str
字符串对象:
-
.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
,放在从"高"位开始的第二个字节中。