Python: Попытка разбить instream на куски размером с бит - PullRequest
0 голосов
/ 01 марта 2019

В настоящее время я читаю инстрим и разбиваю его на 3 байтовых блока:

instream_chunks = [instream[i:i+3]for i in range (0, len(instream), 3)]

Что мне не удается сделать, так это разделить этот блок данных на блоки размером 22 бита.Есть ли способ сделать это в Python?

Редактировать: экземпляр создан (для целей тестирования) следующим образом:

instream = open('C:/xxx/test.txt', 'rb+')

И этот экземпляр затем используется в этой функции

def write(self, instream: typ.BinaryIO):

Что начинается с того, что я описал выше.

1 Ответ

0 голосов
/ 01 марта 2019

Предполагая, что у вас достаточно памяти, вы можете преобразовать instream в список битов и затем нарезать его по своему усмотрению.

def access_bit(data, num):
    base = int(num/8)
    shift = num % 8
    return (data[base] & (1<<shift)) >> shift

def to_bits(instream):
    ba = bytearray(instream.read())
    return [access_bit(ba,i) for i in range(len(ba)*8)]

>>>to_bits(open('test.txt','rb'))

[0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0]

В противном случае вам придется читать меньшие куски, кратные размеру, который вы хотите, а затем использовать вышеуказанный метод для каждого.Например, вы читаете 22 * ​​4 = 88 бит или 11 байтов, а затем вызываете to_bits для этого, разбиваете полученный массив на 4 22-битных блока и повторяете.

...