Шаги с 1 по 3, я реализовала. И застряла на шаге 4, реализование encoder Хафмана ( не испольхуя встроенные функции ). Не могу сообразить, как мне прописать этот шаг. Как я могу закодировать двочный файл кодом Хафмана? Как упаковать поток битов?
Я преобразовала пример из интернета под свою задачу:
import heapq
from collections import Counter
from collections import namedtuple
class Node(namedtuple("Node", ["left", "right"])):
def walk(self, code, acc):
self.left.walk(code, acc + "0")
self.right.walk(code, acc + "1")
class Leaf(namedtuple("Leaf", ["char"])):
def walk(self, code, acc):
code[self.char] = acc or "0"
def huffman_encode(s):
h = []
for ch, freq in Counter(s).items():
h.append((freq, len(h), Leaf(ch)))
heapq.heapify(h)
count = len(h)
while len(h) > 1:
freq1, _count1, left = heapq.heappop(h)
freq2, _count2, right = heapq.heappop(h)
heapq.heappush(h, (freq1 + freq2, count, Node(left, right)))
count += 1
code = {}
if h:
[(_freq, _count, root)] = h
root.walk(code, "")
return code
s = open('en8bit.bin','r')
code = huffman_encode(s)
encoded = "".join(code[ch] for ch in s)
b = open('56.bin', 'wb')
pickle.dump(encoded, b)
b.close()
При запуске выводит в строке:
code = huffman_encode(s)
Ошибку:
UnicodeDecodeError: ‘charmap’ codec can't decode byte 0x98 in position 1992: character maps to <undefined>
Как мне ее исправить?
Как я понимаю моя ошибка состоит в в том, что я не правильно “читаю” двоичный файл en8bit.bin.
Как мне “запоковать” свой поток битов ( bitstream), чтобы ввести их в код?