为什么这两个变量中的一个以相反的顺序打印到文件中?

时间:2017-06-04 23:59:31

标签: c++ endianness

以下是变量:

int z = 0x12345678;
char zz[] = { 0x12, 0x34, 0x56, 0x78 };

我使用以下方法将它们打印到文件中:

ofstream myfile;
myfile.open("myfile.txt", ios::out | ios::binary);
myfile.write((const char*)&z, sizeof(z));
myfile.write((const char*)&zz, sizeof(zz));
myfile.close();

在十六进制编辑器中看到该文件包含此内容:

78 56 34 12 12 34 56 78

为什么订单反转?使两者的行为方式相同的解决方法是什么?我希望int以相同的顺序打印,就像我输入char一样。

我在另一个地方遇到同样的问题,我写了一个函数,为输入值打印二进制文件。它将参数作为const char *。我将int z' saddress转换为const char *并且可以调用该函数,我也可以传递zz的地址。该功能屏蔽每个位并查看它是0还是1并将其打印到屏幕上。由于int和char的解释方式不同,因此该函数适用于char,但不适用于int。

2 个答案:

答案 0 :(得分:3)

这是因为结束(请参阅https://en.wikipedia.org/wiki/Endianness)。您应该编写与endiness无关的代码以避免此类问题。

编辑:IBM有关于此https://www.ibm.com/developerworks/aix/library/au-endianc/index.html

的精彩文章

答案 1 :(得分:2)

因为您在小端机器上运行代码,因此int以78 - 56 - 34 -12存储在内存中。 在编写字节序列时,您正在磁盘上写入int的4个字节,因为它们在内存中。因此,与4字节数组相比,int具有镜面反射。

关键是:直到你在同一台机器上编写和读取相同类型的数据(因此你没有处理Big Endian和Little Endian问题)我没有看到找到解决方案的重点,以便有两个12345678序列写在磁盘上。