【问题标题】:Writing files in bit form to a file in C以位形式将文件写入C中的文件
【发布时间】:2010-12-23 19:30:29
【问题描述】:

我正在用 C 语言实现霍夫曼算法。我已经掌握了基本功能,直到获得二进制代码字为止。例如, abcd 将是 100011000 或类似的东西。现在的问题是如何在压缩文件中以二进制形式编写此代码。我的意思是如果我正常写它,每个 1 和 0 将是一个字符,所以没有压缩。

我需要以位的形式写出这些 1 和 0。这在 C 语言中是否可行?如果可以,怎么办?

【问题讨论】:

  • 好吧,我只是问在这种情况下该怎么做。简单地编写代码作为 ascii 并不能达到目的。一定有别的办法。
  • 您应该在编码函数中生成一个 int 而不是 char*,或者编写一个函数将字符串转换为表示该位序列的 int 或 long。
  • @Vinko:转换为数字然后存储不好。他必须小心符号和字节序,更不用说架构了(int 在不同的拱门上可以有不同的大小)。无符号字符是最安全的选择。
  • @Stan:正确。我的想法与 Nils 所写的内容一致,即使我建议的实现细节不合适。也就是,不要写每个 1 或 0 的 ASCII 值。

标签: c bit-manipulation binaryfiles huffman-code


【解决方案1】:

收集位,直到你有足够的位来填充一个字节,然后写入它..

例如像这样:

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 等于 0:

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

【讨论】:

  • 感谢您指出这一点...那么如何结束文件呢?...我想在这种情况下我们需要自己做。
  • 只需调用上面定义的 Flush_Bits。
  • 代码中有一个问题:当设置了一个位时,您只能移位。假设您要输出10000000。 1 永远不会到达最高位,对吧?
  • 因此WriteBit()中的前两行代码必须是bit_buffer &lt;&lt;= 1; if (bit) bit_buffer |= 0x1;
  • 我已经用 C++ 实现了 Huffman(Planet-Source-Code.com/vb/scripts/…,如果你有兴趣的话)。您应该以尾随 0 结束编码文件(以防编码位数不是 8 的倍数)。如果你正确地实现了解码阶段,那么它将简单而透明地忽略最后多余的 0,因为此时剩下要解码的符号数将为 0。
猜你喜欢
  • 1970-01-01
  • 2013-07-10
  • 2012-10-26
  • 2021-10-20
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多