[英]C++ Binary Writing/Reading on 32bit to/from 64bit
如果您有二进制输出流 ,并将整数写入32位Windows计算机上的文件。 那么您是否能够在64位Windows计算机上从同一文件中读取相同的整数?
我的猜测是否定的 。 由于32位计算机上的整数是4个字节,因此64位计算机上的整数是8个字节。
以下代码也是如此,而无论操作系统,计算机体系结构和数据类型如何,都必须能够从64位和32位计算机读取和写入文件。 如果不是,那么如何才能做到这一点,而文件必须是二进制形式。
std::ofstream ofs("example.bin", std::ios::binary);
int i = 128;
ofs.write((char*) (&i), sizeof(i));
ofs.close();
std::ifstream ifs("example.bin", std::ios::binary);
int i = 0;
ifs.read((char*) (&i), sizeof(i));
ifs.close();
虽然int
在几乎所有现代平台(32位和64位)上都是4个字节,但不能保证其大小。 因此,为了将数据序列化到文件或其他二进制流中,您应该更喜欢C ++ 11中引入的头文件<cstdint>
固定宽度整数类型(某些编译器在C ++ 03中支持它):
#include <cstdint>
...
int32_t i = 128;
ofs.write((char*)(&i), sizeof(i));
...
另一种选择是强制某种类型具有一定的大小,例如int
以具有大小4.为了确保你的程序不能编译,如果不是这样,请使用static_assert
:
...
int i = 128;
static_assert(sizeof(i) == 4, "Field i has to have size 4.");
ofs.write((char*)(&i), sizeof(i));
...
虽然这听起来很愚蠢,考虑到我们如上所述固定宽度整数,但如果你想存储一个你在某个库的某个版本中做出假设的整个结构,这可能会很有用。 示例:来自glm
vec4
被记录为包含四个浮点数,因此在序列化此结构时,最好静态地检查它以便捕获将来的库更改(不太可能但可能)。
然而,另一个非常重要的考虑因素是整体类型的结束,这些类型因平台而异。 现代x86桌面平台的大多数编译器对整数类型使用小端,所以我更喜欢这种二进制文件格式; 但如果平台使用大端,则需要转换它(反转字节顺序)。
不能保证C ++中int的大小。 你要知道的是,它至少与short int一样大,并且不大于long int。 编译器可以在这些约束中自由选择合适的大小。 虽然大多数人会选择32位作为int的大小,但有些人不会。
如果您知道您的类型总是32位,那么您可以使用int32_t类型。
include <stdint.h>
得到这种类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.