【问题标题】:Library for cross platform datatypes in CC 中跨平台数据类型的库
【发布时间】:2012-07-29 04:33:25
【问题描述】:

是否有用于提供跨平台数据类型的 C(不是 C++、Boost 等)库?

详细说明,我想将int 存储在 32 位 linux 机器的文件中,从 64 位 Windows 机器读取文件和相同的 int。这可能吗?

更新:我也不想使用 sqlite 或某种数据库。我想要一个可以帮助我在整个代码中使用数据类型的库。

【问题讨论】:

  • 你需要先挑选你的毒药——ASN.1、xml 等等——然后找到一个支持它的库。
  • 你可能想要一个序列化库。 XDR 存在多年。还有许多其他选择。
  • 这是关于可移植二进制序列化的。

标签: c cross-platform


【解决方案1】:

如果您只想存储 32 位有符号整数,只需确定一种格式,例如大端序。然后您可以自己编写序列化/反序列化:

void write_int32_be (int32_t i, FILE *f)
{
  uint8_t buf[4];

  buf[0] = ((uint32_t)i >> 24);
  buf[1] = ((uint32_t)i >> 16) & 0xFF;
  buf[2] = ((uint32_t)i >> 8) & 0xFF;
  buf[3] = (uint32_t)i & 0xFF;
  fwrite (buf, 4, 1, f);
}

int32_t read_int32_be (FILE *f)
{
  uint8_t buf[4];

  fread (buf, 4, 1, f);

  return ((uint32_t)buf[0] << 24) |
         ((uint32_t)buf[1] << 16) |
         ((uint32_t)buf[2] << 8) |
          (uint32_t)buf[3];
}

如果您需要多种类型,请使用tplEetAvroprotobuf-c 等库或XDRJSONASN.1 等标准的实现。如果您有大型数值数据集,请使用 HDFNetCDF 之类的东西。

【讨论】:

    【解决方案2】:

    如果您的编译器了解 C99 标准,那么您可以使用 int32_t

    http://en.wikipedia.org/wiki/C_data_types#Fixed_width_integer_types 恕我直言,您的操作系统应该具有相同的字节序。 x86 和 x86_64 上的 Windows 和 Linux 都是 little-endian,所以它应该可以工作。 http://en.wikipedia.org/wiki/Endianness#Endianness_and_operating_systems_on_architectures

    【讨论】:

    • 请注意,对于架构,使用这些固定宽度类型的计算可能比使用“本机类型”慢。因此,如果速度是您的首要任务,您可以考虑将它们仅用于读取和写入文件,而在实际代码中将它们转换为 int_fast32_t。
    • 固定宽度类型为本机类型,否则将丢失。
    最近更新 更多