【发布时间】:2011-04-18 22:40:05
【问题描述】:
我一直在寻找如何将大端转换为小端。但是我没有找到任何可以解决我问题的好方法。似乎有很多方法可以进行这种转换。无论如何,下面的代码在大端系统中工作正常。但是我应该如何编写一个转换函数,以便它也可以在 little-endian 系统上工作呢?
这是一个作业,但它只是一个额外的,因为学校的系统运行大端系统。只是我很好奇,想让它也能在我的家用电脑上运行
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream file;
file.open("file.bin", ios::in | ios::binary);
if(!file)
cerr << "Not able to read" << endl;
else
{
cout << "Opened" << endl;
int i_var;
double d_var;
while(!file.eof())
{
file.read( reinterpret_cast<char*>(&i_var) , sizeof(int) );
file.read( reinterpret_cast<char*>(&d_var) , sizeof(double) );
cout << i_var << " " << d_var << endl;
}
}
return 0;
}
已解决
所以 Big-endian VS Little-endian 只是字节的相反顺序。无论如何,我编写的这个函数似乎符合我的目的。我在这里添加它以防其他人将来需要它。不过,这仅适用于双精度,对于整数,请使用建议的函数 torak,或者您可以通过使其仅交换 4 个字节来修改此代码。
double swap(double d)
{
double a;
unsigned char *dst = (unsigned char *)&a;
unsigned char *src = (unsigned char *)&d;
dst[0] = src[7];
dst[1] = src[6];
dst[2] = src[5];
dst[3] = src[4];
dst[4] = src[3];
dst[5] = src[2];
dst[6] = src[1];
dst[7] = src[0];
return a;
}
【问题讨论】:
-
即使您解决了字节序问题,浮点格式也可能因平台而异。您不能在一个平台上保存二进制浮点值并期望在另一个平台上加载它们。这是你做这个二进制的要求吗?
-
这不是必需的,因为作业要在学校的电脑上完成并显示。我只是想知道如何在 Windows 计算机上读取这个二进制文件,这只是我的好奇心。
-
@sbi - 目前哪些平台在非 IEE-754 中实现了浮点?
-
@Kos: not much,我相信你不需要使用它们。
标签: c++ binaryfiles endianness