在C语言中将文件以比特形式写入文件

13

我正在C语言中实现哈夫曼算法。已经实现了基本功能,直到获取二进制编码字为止,例如abcd将变成100011000或类似的东西。现在问题是如何以二进制形式在压缩文件中写入此代码。我的意思是,如果我正常写入,每个1和0都将成为一个字符,因此不会进行压缩。

我需要以其位形式将这些1和0写入。在C中是否可能?如果可以,怎么做?


我只是在询问在这种情况下该怎么做。仅仅将代码编写为ASCII并不能达到目的,肯定还有其他方法。 - sfactor
在编码函数中,你应该生成一个 int 而不是 char*。否则,请编写一个函数,将字符串转换为表示该比特序列的 int 或 long。 - Vinko Vrsalovic
1
@Vinko:将其转换为数字然后存储是不好的。他必须小心符号和字节顺序,更不用说架构了(int 在不同的架构上可能具有不同的大小)。无符号字符是最安全的选择。 - Stan
@Stan:没错。我的想法与Nils所写的类似,尽管我建议的实现细节不太合适。也就是说,不要写出每个1或0的ASCII值。 - Vinko Vrsalovic
1个回答

22

收集位(bit)直到有足够的位填满一个字节(byte),然后写入它。

例如,像这样:

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);
}

谢谢指出这个问题...那么如何结束文件呢?我想在这种情况下我们需要自己处理。 - sfactor
只需按照以上定义调用 Flush_Bits。 - Nils Pipenbrinck
代码存在问题:只有在某个位被设置时才进行移位。假设你想输出“10000000”。那么这个1永远无法到达最高位,对吗? - Dr. Jan-Philip Gehrcke
1
因此,在 WriteBit() 中的前两行代码必须是 bit_buffer <<= 1; if (bit) bit_buffer |= 0x1; - Dr. Jan-Philip Gehrcke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接