【问题标题】:C - Writing integers to binary file using only 3 bytesC - 仅使用 3 个字节将整数写入二进制文件
【发布时间】:2017-02-26 20:01:50
【问题描述】:

我有一个 C 语言程序,可以将频率表写入二进制文件。 频率表是一个数组,其中包含一个 int 和一个 char 的结构。

所以我必须将一个 unsigned int 计数器和一个 unsigned char 字符写入文件(多次)。

我知道一个整数通常使用 4 个字节,但是我知道 int 计数器永远不会大于 2^24-1。

所以我可以使用 4 个字节将计数器和字符写入文件 => 3 个字节用于计数器,1 个字节用于字符。这也很容易阅读。

有没有一种简单的方法可以在不使用特殊库的情况下在 C 中做到这一点?

【问题讨论】:

  • 这可以使用char[4]fread/fwrite 轻松完成。如果这还不够提示,请更具体地说明您不知道该怎么做。

标签: c file io binary


【解决方案1】:

是的,在 C 中有一种非常简单的方法。您可以将 char(在所有平台上都是一个字节)与最大 24 位大小的 int 组合在一起,方法是将 char 移动向左 24 位:

uint32_t toWrite = (myChar << 24) | myCount;

当你读回数据时,执行相反的操作:

uint32_t fromFile;
uint32_t myCount = fromFile & 0xFFFFFF;
char myChar = (fromFile >> 24) & 0xFF;

【讨论】:

  • 现在您遇到了字节顺序问题。此外,移入符号位是 UB。
  • @zwol 整数没有任何字节序。
  • @WeatherVane fwrite(&amp;toWrite, sizeof(int), 1, fp) 写入文件的字节有一个字节序,你不知道是哪一个。
  • @zwol 将多字节值写入文件会带来字节顺序。只要您在具有相同字节顺序的平台上读取数据,您就不必做任何事情。否则,您需要应用 hton / ntoh 函数。
  • @zwol 对我来说,这首先取决于写入文件的目的。如果这是短期存储和检索的快速工作,转储内存格式是可以接受的。如果您打算将其保留很长一段时间(例如,几年),或者您希望获得跨平台兼容性,那么使用可预测的顺序是一个不错的选择。
猜你喜欢
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多