[英]how to unpack every n bits from a byte array into an integer array
data
来自二进制文件,我使用 numpy 将其转换为 byte_array,如下所示:
byte_array = np.frombuffer(data, dtype=np.uint8)
有没有什么方便的方法可以从这个byte_array
中提取每 n 位(8<=n<=20),然后将这些 n 位转换为整数并将所有整数存储在一个数组中?
我能想到的唯一方法是byte_array
,首先提取一个完整的字节,如果到目前为止提取的总位数小于n,则提取剩余的位,然后与第一个字节连接并形成一个输出整数,将该整数存储到输出数组。
例如,n = 12, byte_array[0:3] = 123, 99, 100
output_integer[0] = 123 | ((99&0xF)<<8) # bits 0..7 from 123 and bits 8..11 from the lower 4 bits of 99
output_integer[1] = (99>>4) | (100<<4) # bits 0..3 from higher 4 bits of 99 and bits 4..11 from 100
您可以创建一个生成器来产生位,并使用例如more_itertools.chunked
来处理 n-chunks 中的位流:
from more_itertools import chunked
def get_bits(data):
for b in data:
yield from f'{bin(b)[2:]:0>8}'
data = b'0123456789'
n = 20
for bits in chunked(get_bits(data), n):
print(int(''.join(bits), base=2))
在上面的示例中,如果(r := len(data)*8 % n) != 0
bits
最后一位的长度将是r < n
。 如果不希望这样,您可以预先在左侧(即在开始时)填充比特流,这需要知道它的长度,或者使用例如more_itertools.grouper
在右侧(即在末尾)填充它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.