为啥这两个变量之一以相反的顺序打印到文件中?
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 序列写入磁盘。
【讨论】:
以上是关于为啥这两个变量之一以相反的顺序打印到文件中?的主要内容,如果未能解决你的问题,请参考以下文章
我在运行代码时遇到错误,该代码接受用户的温度并以相反的顺序打印,为啥会这样?