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

Efficiently reorganize binary data then transpose chunk

我有一个包含 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)。

因此,当您尝试 join 它们时,它会从每个整数类型创建一个新的 BitArray 对象,它被解释为 "create a BitArray of this length"。所以 BitArray(False) 是空的(长度为零),而 BitArray(True) 是单个零位!

这有点违反直觉,但由于太长的原因无法进入这里。

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

print(BitArray(blist))