2009-04-05 3 views
7

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

ответ

9

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

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

3

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

Вы можете установить n-й бит в 1 с помощью:

my_byte = my_byte | (1 << n); 

где п 0 до 7.

Вы можете установить n-й бит в 0 с помощью:

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

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

my_byte = my_byte^(1 << n); 

Подробнее here.

2

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

1

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

+0

Вам не нужно подсчитывать количество элементов файла, которое может быть присвоено специальному символу –

2

Вся информация вам нужно на с битами здесь:
How do you set, clear, and toggle a single bit?

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