繁体   English   中英

C ++二进制写入/读取32位到/从64位

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM