кодировка Хаффмана

Я пытаюсь реализовать алгоритм сжатия Хаффмана, который требует записи битов переменной длины в файл. Есть ли способ в С++ записывать данные переменной длины с 1-битной детализацией в файл?


person Community    schedule 05.04.2009    source источник


Ответы (5)


Нет, наименьший объем данных, которые вы можете записать в файл, составляет один байт.

Вы можете использовать bitset, чтобы упростить управление битами, а затем использовать ofstream для записи в файл. Если вы не хотите использовать набор битов, вы можете использовать побитовые операторы для управления вашими данными перед их сохранением.

person Bill the Lizard    schedule 05.04.2009

Наименьшее количество битов, к которым вы можете получить доступ и сохранить, составляет 8 = 1 байт. Вы можете получить доступ к битам в byte, используя битовые операторы ^ и |.

Вы можете установить n-й бит равным 1, используя:

my_byte = my_byte | (1 << n);

где n от 0 до 7.

Вы можете установить n-й бит равным 0, используя:

my_byte = my_byte & ((~1) << n);

Вы можете переключать n-й бит, используя:

my_byte = my_byte ^ (1 << n);

Подробнее здесь.

person klew    schedule 05.04.2009

ответ klew, вероятно, тот, который вам нужен, но просто чтобы добавить что-то к тому, что сказал Билл, библиотеки Boost имеют dynamic_bitset , который я нашел полезным в похожей ситуации.

person Dan Hook    schedule 05.04.2009

Вся необходимая вам информация о перестановке битов находится здесь:
Как установить, очистить и переключить один бит?

Но наименьший объект, который вы можете поместить в файл, — это байт.
Я бы использовал dynamic_bitset и каждый раз, когда размер превышал 8, извлекал нижние 8 битов в char и записывал это в файл, а затем сдвигал оставшиеся биты вниз 8 мест (повторить).

person Martin York    schedule 05.04.2009

Нет. Вам придется упаковывать байты. Соответственно, вам понадобится заголовок в вашем файле, который указывает, сколько элементов в вашем файле, потому что у вас, вероятно, будут неиспользуемые конечные биты.

person Paul Nathan    schedule 05.04.2009
comment
вам не нужно подсчитывать количество элементов файла, который может соответствовать eof специального символа - person Xavier Combelle; 31.01.2015