Я работаю с двоичными данными, которые хранятся в байтовом массиве, и мне нужно получить доступ к битам произвольной длины внутри этого массива. Производительность также является проблемой. Позвольте мне привести краткий пример:
# 11111111 | 11101111 | 01111100
byte_arr = bytearray([255, 239, 124])
# A corresponds to the first 6 bits, e.g. index 0-5
a = byte_arr[0]>>2
# B corresponds to the next 2 bits, e.g. index 6-7
b = byte_arr[0] & 0x3
# C corresponds to the next 9 bits, e.g. index 8-16
c = int.from_bytes(byte_arr[1::], byteorder="big", signed=False)>>7
Мое вышеупомянутое решение работает, но типичный байтовый массив имеет 20 байтов, и поэтому код становится нечитаемым и на первый взгляд определенно не интуитивно понятным.
Модули, подобные struct, не помогут, потому что они ТОЛЬКО могут распаковывать байты, например, 2 ^ X