У меня проблема с тем, как преобразовать строку кодирования Хаффмана в двоичный питон.
В этом вопросе ничего не говорится об алгоритме Хаффмана.
Это так:
Я могу получить закодированную строку Хаффмана, скажем, 01010101010
. Примечание , это строка.
Но теперь я хочу сохранить строковое представление в настоящий двоичный файл.
В строке, закодированной Хаффманом, каждые 0 и 1 представляют собой байт .
Я хочу, чтобы каждые 0 и 1 были бит .
Как я могу сделать это в Python?
Редактировать 1:
Пожалуйста, прости, я не достаточно ясно описал свою проблему.
Позвольте мне объяснить мой текущий подход к записи в нули, а в двоичную систему.
Скажем, мы можем кодировать строку s = '010101010'.
- Я использую
int
, чтобы преобразовать его в целое число
- Затем используйте
unichr
, чтобы преобразовать его в строку, чтобы я мог записать его в файл
- записать строку в файл в двоичном режиме
Также следует отметить, что мне нужно прочитать файл для декодирования кода Хаффмана.
Итак, мой подход,
- чтение байтов из файла
- восстановить их в int
- преобразовать int в их строку двоичного представления.
- расшифровать строку
И на шаге 2 проблема возникает, и я стал невежественным.
Поскольку некоторые строки Хаффмана могут быть короткими (например, 10
), в то время как некоторые могут быть длинными (010101010101001
). Это приводит к разной длине байта в значении int (
некоторая короткая строка может занимать всего один байт, в то время как длинные строки могут занимать два или даже больше
)
Следующий код иллюстрирует мою проблему:
ss=['010101','10010101010']
# first one is short and takes only one byte in its int value
# second one is long and takes two bytes
print 'write it to file'
with open('binary.bin','wb') as f:
for s in ss:
n=int(s,2)
print n
s=unichr(n)
f.write(s)
print 'read it to file'
with open('binary.bin','rb') as f:
for s in f.read():
print ord(s)
Я читаю один байт за раз во второй с частью , но это на самом деле не правильно. Потому что строка 10010101010
занимает два байта.
Итак, когда я читаю эти байты из файла, сколько байтов я должен прочитать за раз?