我有一个原始二进制文件,其中包含32个样本,每个样本为256位。每个样本的第n个元素组合起来创建一个有效样本,因此在这种情况下有256个有效样本。输入文件上的示例顺序不正确,必须重新排序。为此,我使用bitstring模块并读取8192位,然后将它们解压缩到正确的顺序。这种缝合理。现在我必须将所有样本的第n位组合成一个新结构,以便每个样本都是32位。我问如何有效地重新排序(完成),然后转置原始二进制数据。也许完全放弃bitstring模块会更好。
from bitstring import ConstBitStream, ReadError, BitArray
ch = [ConstBitStream('0x0000000000000000000000000000000000000000000000000000000000000000')
for i in range(32)]
test = "test"
fp = ConstBitStream(filename="test.jlb")
try:
firstChunk = fp.read(8192)#read one sample
ch[28],ch[29],ch[17],ch[18],ch[19],ch[11],ch[14],ch[12],\
ch[31],ch[23],ch[13],ch[21],ch[20],ch[7],ch[24],ch[9],\
ch[8],ch[27],ch[10],ch[30],ch[22],nocare,nocare,ch[6],\
ch[4],ch[5],ch[3],ch[2],ch[1],ch[15],ch[0],nocare = firstChunk.unpack('32*bits:256')#put it in order
except ReadError:
pass
blist = [element[3] for element in ch]#try to create new sample
print(blist)#looks good list of booleans
print(BitArray('').join(blist))#no good 0x00
答案 0 :(得分:1)
当你构造blist
时,你得到的布尔列表,在Python中只是整数(False == 0,True == 1)。
因此,当您尝试join
时,它会从每个整数类型创建一个新的BitArray
对象,该对象被解释为"创建此长度的BitArray
&#34 ;。所以BitArray(False)
为空(长度为零),而BitArray(True)
为单个零位!
这是违反直觉的,但由于原因太长而无法进入,因此无法提供帮助。
要从布尔列表中创建,只需直接执行而不是使用join:
print(BitArray(blist))