对于二进制文件的可移植性,我对二进制I/O有疑问。假设运行我的软件的PC使用8个字节来存储双变量。生成的二进制文件将有8个字节用于一个双变量。现在假设文件是在PC中打开的,它使用6个字节作为一个双变量(只是假设)。然后,应用程序将只从文件中读取6个字节,并将其存储在内存中的双变量中。这不仅会导致数据的下溢/溢出,而且由于读取不足造成的2字节偏移,在双读后读取的数据也肯定是不正确的。我想支持我的应用程序,不仅仅是32/64位,还有Windows,Ubuntu。那么,如何确保从任何PC中读取的数据都是相同的呢?
发布于 2014-01-10 14:02:32
通常,您应该将存储在二进制文件中的数据封装在自己的数据结构中,并为这些数据结构实现平台无关的读/写操作--基本上,写入磁盘的二进制数据结构的大小对于所有平台都应该是相同的(在所有受支持的平台上,基本数据的最大大小)。
当在数据大小较小的平台上写入数据时,应将数据填充为额外的0字节,以确保记录的数据大小保持不变。
当读取数据时,可以在已知大小的固定数据块中读取整个数据,并应根据所写入的/正在读取的平台执行转换。这也应该照顾到恩典。您可能需要包含一些标头,指示数据的大小,以便在读取文件时区分记录在不同平台上的文件。
这将为二进制文件提供真正独立于平台的序列化。
双打的例子
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个字节读入二进制文件,并在必要时根据写入/正在读取的平台进行转换(您可能会在文件中添加一些小的标题,以识别记录在其上的平台)
虽然自定义转换确实增加了一些开销,但它比将值存储为文本的开销要小得多,而且通常只对不兼容的平台执行转换,而对于相同的平台则不存在开销。
发布于 2014-01-10 14:02:48
克斯丁包含固定大小的类型定义,因此int32_t总是4字节长。当类型的大小对您很重要时,您可以使用这些代替常规类型。
发布于 2014-01-10 14:06:24
使用Google协议缓冲区或任何其他跨平台序列化库。您还可以根据实际情况推出自己的解决方案,即保证char为1字节(即将任何东西序列化为char数组)。
https://stackoverflow.com/questions/21046177
复制相似问题