Как перемотать указатель потока битов? - PullRequest
0 голосов
/ 23 сентября 2019

Я расшифровываю двоичный файл побайтово.Нет проблем при чтении переменных, размер которых кратен 8 битам, например:

#encoder
bitstream.add(data_id, 16)

#decoder
data_id = struct.unpack('>H', in_file.read(2))[0]

Что если данные, которые я готов декодировать, не кратны 8 битам?Например, я добавляю в поток битов следующие данные:

#encoder
bitstream.add(F1, 1)
bitstream.add(F2, 1)
bitstream.add(F3, 1)
bitstream.add(F4, 1)
bitstream.add(F5, 1)
if (aflag):
    bitstream.add(F6_a, 1)
    bitstream.add(F7, 1)
else:
    bitstream.add(F6_b, 1)

Если значение if равно True, мне нужно прочитать 7 бит, в противном случае я прочитал 6 бит.

#decoder
# read 8 bits
data = struct.unpack('>B', in_file.read(1))[0]
F1 = data >> 7
F2 = data >> 6 & 0b01
F3 = data >> 5 & 0b001
F4 = data >> 4 & 0b0001
F5 = data >> 3 & 0b00001
if (aflag):
  # first data block
  F6_a = data >> 2 & 0b000001
  F7 = data >> 1 & 0b1
else:
  # second data block
  F6_b = data >> 2 & 0b000001

InВ случае first data block я читаю 7 бит, и у меня есть запасной 1. В случае second data block я читаю 6 бит, и у меня есть 2 запасных бита.После этих 8 битов у меня есть переменные, которые кратны 8 битам или группам переменных, которые вместе имеют размер, кратный 8 битам.Итак, я ищу решение, которое не подразумевает чтение всех последующих переменных, учитывающих запасные биты.

В случае first data block как я могу установить указатель битового потока на 7-й бит, так чточто я могу прочитать следующие данные, как будто в предыдущем чтении не было резервных битов?

...