Я пытаюсь реализовать алгоритм сжатия Хаффмана, который требует записи битов переменной длины в файл. Есть ли способ в С++ записывать данные переменной длины с 1-битной детализацией в файл?
кодировка Хаффмана
Ответы (5)
Нет, наименьший объем данных, которые вы можете записать в файл, составляет один байт.
Вы можете использовать bitset, чтобы упростить управление битами, а затем использовать ofstream для записи в файл. Если вы не хотите использовать набор битов, вы можете использовать побитовые операторы для управления вашими данными перед их сохранением.
Наименьшее количество битов, к которым вы можете получить доступ и сохранить, составляет 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);
Подробнее здесь.
ответ klew, вероятно, тот, который вам нужен, но просто чтобы добавить что-то к тому, что сказал Билл, библиотеки Boost имеют dynamic_bitset , который я нашел полезным в похожей ситуации.
Вся необходимая вам информация о перестановке битов находится здесь:
Как установить, очистить и переключить один бит?
Но наименьший объект, который вы можете поместить в файл, — это байт.
Я бы использовал dynamic_bitset и каждый раз, когда размер превышал 8, извлекал нижние 8 битов в char и записывал это в файл, а затем сдвигал оставшиеся биты вниз 8 мест (повторить).
Нет. Вам придется упаковывать байты. Соответственно, вам понадобится заголовок в вашем файле, который указывает, сколько элементов в вашем файле, потому что у вас, вероятно, будут неиспользуемые конечные биты.