首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中二进制文件的可移植性?

问C++中二进制文件的可移植性?
EN

Stack Overflow用户
提问于 2014-01-10 13:56:56
回答 3查看 1.1K关注 0票数 2

对于二进制文件的可移植性,我对二进制I/O有疑问。假设运行我的软件的PC使用8个字节来存储双变量。生成的二进制文件将有8个字节用于一个双变量。现在假设文件是在PC中打开的,它使用6个字节作为一个双变量(只是假设)。然后,应用程序将只从文件中读取6个字节,并将其存储在内存中的双变量中。这不仅会导致数据的下溢/溢出,而且由于读取不足造成的2字节偏移,在双读后读取的数据也肯定是不正确的。我想支持我的应用程序,不仅仅是32/64位,还有Windows,Ubuntu。那么,如何确保从任何PC中读取的数据都是相同的呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-10 14:02:32

通常,您应该将存储在二进制文件中的数据封装在自己的数据结构中,并为这些数据结构实现平台无关的读/写操作--基本上,写入磁盘的二进制数据结构的大小对于所有平台都应该是相同的(在所有受支持的平台上,基本数据的最大大小)。

当在数据大小较小的平台上写入数据时,应将数据填充为额外的0字节,以确保记录的数据大小保持不变。

当读取数据时,可以在已知大小的固定数据块中读取整个数据,并应根据所写入的/正在读取的平台执行转换。这也应该照顾到恩典。您可能需要包含一些标头,指示数据的大小,以便在读取文件时区分记录在不同平台上的文件。

这将为二进制文件提供真正独立于平台的序列化。

双打的例子

代码语言:javascript
复制
class CustomDouble
{
public:
double val;
static const int DISK_SIZE;

void toFile(std::ofstream &file)
{
   int bytesWritten(0);
   file.write(reinterpret_cast<const char*>(&val),sizeof(val));
   bytesWritten+=sizeof(val);
   while(bytesWritten<CustomDouble::DISK_SIZE)
   { 
      char byte(0);
      file.write(&byte,sizeof(byte));
      bytesWritten+=sizeof(byte);
   }

}
};
const int CustomDouble::DISK_SIZE = 8;

这将确保您始终在平台上编写大小为double的8个字节。读取文件时,始终将这8个字节读入二进制文件,并在必要时根据写入/正在读取的平台进行转换(您可能会在文件中添加一些小的标题,以识别记录在其上的平台)

虽然自定义转换确实增加了一些开销,但它比将值存储为文本的开销要小得多,而且通常只对不兼容的平台执行转换,而对于相同的平台则不存在开销。

票数 2
EN

Stack Overflow用户

发布于 2014-01-10 14:02:48

克斯丁包含固定大小的类型定义,因此int32_t总是4字节长。当类型的大小对您很重要时,您可以使用这些代替常规类型。

票数 1
EN

Stack Overflow用户

发布于 2014-01-10 14:06:24

使用Google协议缓冲区或任何其他跨平台序列化库。您还可以根据实际情况推出自己的解决方案,即保证char为1字节(即将任何东西序列化为char数组)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21046177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档