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

Posted

技术标签:

【中文标题】为啥这两个变量之一以相反的顺序打印到文件中?【英文标题】:Why do one of these two variables print in opposite order into the file?为什么这两个变量之一以相反的顺序打印到文件中? 【发布时间】:2017-06-04 23:59:30 【问题描述】:

这里是变量:

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。

【问题讨论】:

如果您的函数不起作用,那么它假定字节顺序不正确 【参考方案1】:

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

编辑:IBM 对此https://www.ibm.com/developerworks/aix/library/au-endianc/index.html 有一篇精彩的文章

【讨论】:

【参考方案2】:

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

关键是:直到您在同一台机器上写入和读取相同类型的数据(所以您不是在处理 Big Endian 和 Little Endian 问题)我没有看到找到解决方案以便拥有的意义两个 12345678 序列写入磁盘。

【讨论】:

以上是关于为啥这两个变量之一以相反的顺序打印到文件中?的主要内容,如果未能解决你的问题,请参考以下文章

为啥合并打印顺序相反

我在运行代码时遇到错误,该代码接受用户的温度并以相反的顺序打印,为啥会这样?

如何以相反的字节顺序打印变量?

为啥线程味精以相反的顺序出现?

是否可以以相反的顺序使System.out.print排序变量?

附加两个csv文件时如何修复pandas concat