Я расшифровываю двоичный файл побайтово.Нет проблем при чтении переменных, размер которых кратен 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-й бит, так чточто я могу прочитать следующие данные, как будто в предыдущем чтении не было резервных битов?