【问题标题】:C : Write char array (containing '1' and '0') into as binary in a fileC:将char数组(包含'1'和'0')作为二进制文件写入文件
【发布时间】:2018-05-16 16:04:13
【问题描述】:

我在将 '1' 和 '0' 的 char 数组作为二进制文件写入文件时遇到了麻烦。 这是我正在尝试做的一个例子:

int main(){
  FILE * file;
  file = fopen("file" , "w+b");

  char buffer[8] = "11001100"; // 8 bits-> 1 byte to write

  fwrite(buffer,1,8,file);

  fclose(file);
  return 0;
}

问题是它在我的文件中将自己写入为文本(写入 8 个字节),而不是二进制/仅 1 个字节。

我做错了什么?

提前感谢您的帮助。

【问题讨论】:

  • 标准库不知道你想要达到什么目的,也不会神奇地将你的字符序列打包/转换成一个字节。在您尝试写入之前,您必须手动将其转换为一个字节的数据。之后,您可以使用 fwrite 将该字节简单地写入文件。
  • 您可以探索strtoul,它将字符串转换为值,使用字符串字符的数字基数。然后将转换后的值写入输出文件。
  • ... 请记住,要使用strtoul,您必须在序列中添加一个零终止符。此时它不是一个字符串 - 它的末尾没有零终止符。
  • 我怀疑您将不得不编写一些代码来迭代字符并将掩码或掩码到输出字节中。如果您从第一个字符开始,那将是 msb,因此您可以将掩码作为 0x80 开始。如果 char 是 '1',或者在掩码中。迭代字符时向右移动掩码。
  • '0''1'01 完全不同。您的字符串中有 8 个字节,而不是 8 位的 1 个字节。如果您将其更改为 unsigned char c = 0xcc;,那么您将拥有 8 位作为 0b11001100

标签: c arrays file binary fwrite


【解决方案1】:

我认为您可以使用0b 前缀... GNU doc

0b 说你正在写一个字节。

如果你这样写的话:

int main(){
  FILE * file;
  file = fopen("file" , "w+b");
  char c;

  c = 0b11001100

  fwrite(&c,1,1,file);

  fclose(file);
  return 0;
}

【讨论】:

    【解决方案2】:

    您必须将包含二进制数的字符串作为 ASCII 转换为字节。您可以自己执行此操作,也可以直接使用strtol()

    char *buffer = "11001100"; // 8 chars
    char *behind;
    char byte = (char)strtol(buffer, &behind, 2); // Base 2 for a binary number
    
    fwrite(&byte,1,1,file); // 1 element with 1 byte ach
    

    【讨论】:

    • @AminNegm-Awad 在我看来,OP 不懂基本的 C,如果11001100 超过CHAR_MAX,你提出了一个溢出char 的解决方案(99% 的情况都是这样)实现),这是未定义的行为。为什么不向 OP 解释字节和位之间的区别?
    • 不,char buffer[8] = "11001100"; 中只有 8 个字节,缺少 nul 字符串终止符。一定要跟着 cmets 跟上步伐。
    • 不,char buffer[8] = "11001100"; 中只有 8 个字节。看看[8]
    • 谢谢,它工作得很好。我仍然会尝试手动操作,我不确定我是否完全理解 strtol 的工作原理
    • 天啊,your 版本中可能有 9 个,但 OP 的代码中只有 8 个。正如我所说,你还没有解决这个问题。
    猜你喜欢
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 2020-10-30
    • 2020-08-10
    • 2016-02-29
    • 1970-01-01
    相关资源
    最近更新 更多