-3

我有一个问题,我需要在 C 中的文本文件中写入位。
我想保存一个大小为 5 个字节的字符串,

char code[] = "0110";

在一个文件中一点一点,使最终的文件大小只有4位。

Input:  size(file) = 5 bytes.
Output: size(file) = 4 bits.

我的问题是:C 中是否有一个函数(例如 fwrite() )可以做到这一点?

4

2 回答 2

1

尝试将表示二进制数的字符串转换为字符,然后将字节写入文件。

您将有一些开销,因为您不能只写入 4 位。

  char *in = "0110";
  char out = 0;

  int i = 0;
  while (in[i] != '\0') {
    out = out * 2 + in[i] - '0';
    i++;
  }

  // Write out in your file.
于 2013-06-30T17:05:49.053 回答
1

C API 将(合理地)不允许您将 4 位写入文件。我也不认为有一个文件系统可以将内容记录为半字节!这只是说,你要做的就是将一个1s 和0s 的字符串解释为一个字节中的一堆位。

为此,您必须写入位。这通常通过位运算符来实现。

因此,例如,如果您有一个 8 字节的“流” 10011100,您可以使用以下代码打包一个字节:

char *sb = "10011100";
unsigned char next = 0;  // Next bit to process
unsigned char pos = 0;   // Position of next bit
unsigned char byte = 0;  // Where to store the result
for (i = 0; i < 8; i++) {
    if ((*sb) == '1') {
        next = 0x01;
    }
    else {
        next = 0x00;
    }
    byte |= next << pos;
    pos++;
}

此代码将从字符串中读取每个字符,并使用按位运算符将 a1或 a 0(甚至不需要,因为初始值是0x00,但这里不关心效率)。byteOR

这是一个非常简单的例子,你必须弄清楚极端情况(如果输入字符串只有 5 个字节怎么办),位排序问题(将这 5 个位放在哪里,在字节的开头还是结尾?还有什么?开始和结束的意思?)等。

于 2013-06-30T17:07:17.387 回答