0

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

详细地说,我想将int一个文件存储在 32 位 linux 机器中,然后int从 64 位 windows 机器中读取文件。这可能吗 ?

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

4

2 回答 2

5

如果您只想存储 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 之类的东西。

于 2012-07-28T20:09:53.943 回答
3

如果您的编译器了解 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

于 2012-07-28T19:43:24.397 回答