Python 高效地重新组织二进制数据,然后转置数据块

Python 高效地重新组织二进制数据,然后转置数据块,python,binary,bitstring,Python,Binary,Bitstring,我有一个原始二进制文件,它包含32个样本,每个样本是256位。每个样本的第n个元素组合起来创建一个有效样本,因此在本例中为256个有效样本。输入文件上的样本顺序不正确,必须重新排序。为此,我使用了位字符串模块,读取8192位,然后将它们解压成正确的顺序。这是合理的。现在我必须将所有样本的第n位合并到一个新的结构中,这样每个样本都是32位。我问的是如何高效地重新排序(完成)然后转置原始二进制数据。也许最好完全放弃位字符串模块 from bitstring import ConstBitStream

我有一个原始二进制文件,它包含32个样本,每个样本是256位。每个样本的第n个元素组合起来创建一个有效样本,因此在本例中为256个有效样本。输入文件上的样本顺序不正确,必须重新排序。为此,我使用了位字符串模块,读取8192位,然后将它们解压成正确的顺序。这是合理的。现在我必须将所有样本的第n位合并到一个新的结构中,这样每个样本都是32位。我问的是如何高效地重新排序(完成)然后转置原始二进制数据。也许最好完全放弃位字符串模块

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

当您构造
blist
时,您会得到布尔值列表,在Python中这些布尔值只是整数(False==0,True==1)

因此,当您尝试
连接它们时,它正在从每个整数类型创建一个新的
位数组
对象,该对象被解释为“创建此长度的
位数组
”。因此
BitArray(False)
为空(长度为零),而
BitArray(True)
为单个零位

这与直觉相悖,但由于篇幅太长,无法在这里进行讨论,因此无法加以帮助

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

print(BitArray(blist))

为了澄清,您正在询问如何读取32 x 256位矩阵的第n列?很抱歉,这会让人困惑。我真的想转置原始二进制数据。