Std:ostream和跨平台兼容性



我有一个简单的文件保存/加载功能,但由于它是一个插件,由于主机API的一切都被写入std::ostream二进制格式,并再次从std::istream读取。

我使用

out.write((char *)&value,sizeof(type));
in.read((char *)&value,sizeof(type));

用于读写,其中类型为"unsigned int"、"double"等。

我在想这可能的后果,当文件保存在一个平台上,并加载到另一个会发生什么(由于主机限制,这将是一个32/64位windows, 64位linux和64位mac,只有x86 cpu)。如果我不使用可变大小类型,如size_t(这在32位和64位系统上是不同的),我可以确定"unsigned int"或"double"将保持相同的长度吗?有什么最好的做法来处理这个问题吗?

如果我不使用可变大小类型,如size_t(这在32位和64位系统上是不同的),我可以确定"unsigned int"或"double"将保持相同的长度吗?

。即使unsigned intdouble的大小也可能因平台而异。


是否有处理这种情况的最佳实践?

是的。序列化数据。

例如,您可以遵循以下步骤:

  • 先写变量的大小,作为一个字节!
  • 然后将变量拆分为N字节数,其中N = sizeof(value),然后逐个写入每个字节-从低有效字节到高有效字节,反之亦然。
  • 在另一台机器上,只需先读取大小,然后逐个读取字节,合并它们以获得值。合并意味着与步骤2中提到的过程相反。

如果你要写很多值,那么你可能想要改进上面的步骤:首先,你不想写每个值的大小,因为它只是一个重复,相反,你可以写一个标题之类的东西,其中包含所有这些信息,这些信息将被重复使用。

您所说的将运行的所有系统将具有与uint32_t相同的大小类型。doublefloat也将相同。
最佳实践仍然是Nawaz的答案。

相关内容

  • 没有找到相关文章

最新更新