Запись файлов в битовой форме в файл на C - PullRequest
10 голосов
/ 06 декабря 2009

Я реализую алгоритм Хаффмана в C. Я получил базовые функциональные возможности вплоть до получения двоичных кодовых слов. так, например, abcd будет 100011000 или что-то подобное. Теперь вопрос в том, как записать этот код в двоичном виде в сжатый файл. Я имею в виду, если я пишу это нормально, каждый 1 и 0 будет один символ, поэтому нет сжатия.

Мне нужно написать эти 1 и 0 в их битовой форме. возможно ли это в C. если да, то как?

1 Ответ

19 голосов
/ 06 декабря 2009

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

например. как то так:

int current_bit = 0;
unsigned char bit_buffer;

FILE *f;

void WriteBit (int bit)
{
  if (bit)
    bit_buffer |= (1<<current_bit);

  current_bit++;
  if (current_bit == 8)
  {
    fwrite (&bit_buffer, 1, 1, f);
    current_bit = 0;
    bit_buffer = 0;
  }
}

Как только вы закончите писать свои биты, вы должны очистить битовый буфер. Для этого просто пишите биты, пока current_bit не станет равным нулю:

void Flush_Bits (void)
{
  while (current_bit) 
    WriteBit (0);
}
...