【问题标题】:Dumping bits/bytes to a file in binary mode以二进制模式将位/字节转储到文件中
【发布时间】:2009-06-17 09:38:00
【问题描述】:

我有以下代码。

FILE *fp;
int a;
fp=fopen("dump.bin","wb");         
a = 0xffafbcdf;
fprintf(fp,"%x",a&0x3ffff);

我试图只转储变量 a 的 18 个 LSBit。但是文件中转储的值是3bcdf。

我的问题 - 是否无法将不是 4(半字节)的倍数的所需位数转储/fwrite/fprintf 到文件中?

编辑:

1.) 当我检查我的文件转储的输出时,我意识到,由于我以二进制模式打开文件,我不应该使用fprintf,但我应该使用fwrite

2.) 我在输出中看到的是 DF BC 03 ,它以 8 位的倍数写入,因此它写入 24 位(3 个字节),但我只对 18 位感兴趣。但后来我意识到没有文件写入库能够将非 8 位的倍数写入文件。它总是会添加前导零位来完成字节,然后转储它。文件数据的“最小计数单位”是一个字节。

【问题讨论】:

  • 恐怕您不能将部分字节写入文件。你必须写完整的字节。如果您希望另一个进程仅读取 18 位,则需要使其专门读取 18 位,或者将位# 写入文件(例如,在前 4 个字节中)。

标签: c file


【解决方案1】:

正如其他人所说,字符是您可以写入文件的最小大小的实体。我只是想观察在二进制文件上使用 fprintf() (或任何其他流输出函数)没有任何问题。

【讨论】:

  • @Neil:如果我使用 fprintf() 写入文件,那么它正在转储字节 3 b c d f 的 ascii 值,即文件包含 32 62 63 64 66。其中 fwrite 正在转储 df bc 03.
  • 是的,它们做不同的事情,但它们都是用于二进制文件的同样有效的函数。
【解决方案2】:

0x3bcdf0xffafbcdf 的 18 个 LSBit,所以它似乎按预期工作。你期待什么?

【讨论】:

    【解决方案3】:

    文件以字节(8 位)而不是半字节(4 位)写入。

    编辑后编辑: fprintf 将打印文本,因此您将获得 6 个字节,其中 - 就像您使用 fwrite 一样,您会将 int(32 位)写入文件,但会屏蔽记录的值。

    【讨论】:

      猜你喜欢
      • 2018-01-20
      • 2012-01-07
      • 2014-06-06
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      • 2020-10-28
      相关资源
      最近更新 更多