有效地重组二进制数据然后转置块
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))
我有一个包含 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))