Чтобы сохранить кодировку, вам потребуется три вещи:
- Какой-то способ восстановления дерева кодирования, отображающего каждый символ в битовую комбинацию.
- Фактическая кодировкапотока.
- Какой-то способ определения конца закодированных данных.
Существует множество способов решения каждой из этих проблем.Вы можете явно хранить шаблоны битов для каждого символа в таблице или просто использовать одну и ту же таблицу кодирования для всех потоков, которые вы сжимаете.Что касается определения конца потока, одним из вариантов может быть использование символа псевдо-EOF для завершения этого потока.Для этого, когда вы создаете дерево кодирования Хаффмана, добавьте к нему новый символ с кратностью, который будет служить в качестве часового, обозначающего конец потока.При записи результата вы пишете этот символ в конце, так что вы можете сказать, где заканчивается поток, даже если он не использует количество бит, которое идеально вписывается в байт.
Для хранения фактического содержимогоЯ бы предложил буферизовать закодированное представление в битовый вектор, который автоматически сбрасывается в файловый поток кратно восьми битам.Конечно, это не единственный способ сделать это, так что выбирайте то, что работает лучше всего.