有效地重组二进制数据然后转置块

时间:2017-09-27 21:42:03

标签: python binary bitstring

我有一个原始二进制文件,其中包含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

1 个答案:

答案 0 :(得分:1)

当你构造blist时,你得到的布尔列表,在Python中只是整数(False == 0,True == 1)。

因此,当您尝试join时,它会从每个整数类型创建一个新的BitArray对象,该对象被解释为"创建此长度的BitArray&#34 ;。所以BitArray(False)为空(长度为零),而BitArray(True)为单个零位!

这是违反直觉的,但由于原因太长而无法进入,因此无法提供帮助。

要从布尔列表中创建,只需直接执行而不是使用join:

print(BitArray(blist))