从字符串到二进制文件

时间:2013-06-30 16:56:38

标签: c file

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

char code[] = "0110";

在一个文件中逐位,这样最终文件大小只有4位。

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

我的问题是:C中是否有一个可以执行此操作的函数(例如fwrite())?

2 个答案:

答案 0 :(得分:1)

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

由于你不能只写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.

答案 1 :(得分:1)

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

为了做到这一点,你必须写位。 这通常通过按位运算符实现。

因此,例如,如果您有一个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++;
}

此代码将读取字符串中的每个字符并推送10(初始值为0x00时甚至不需要,但效率不是此处的问题通过使用按位byte运算符进入OR

这是一个非常简单的例子,你必须找出极端情况(如果输入字符串只有5个字节会怎么样),位排序问题(在那里放置那些5位,在字节的开头或结尾) ?开头和结尾意味着什么?)等等。