我有一个包含n个单精度值的二进制文件。我知道写数据时使用的格式是big-endian。当我将数据读入浮点向量(下面的代码中的'mainvector')时,默认情况下,数据是根据little-endian格式读入的。我使用以下内容来读取数据:
ifstream inputfile("filepath",ifstream::in|ifstream::binary)
inputfile.read(reinterpret_cast<char*>(&mainvector[0]), n*4);
inputfile.close()
关于stackoverflow本身的字节顺序和转换有很多讨论。但是,这是我第一次处理字节序问题,所有可用的信息都有点压倒性。在这个过程中,我了解到字节是反转的(大与小端)。
我是否可以使用一行内容将我的二进制数据的默认little-endian处理方法更改为big-endian,或者后处理我的 mainvector 以获取原始数据?或者我是否需要手动反转每个n值的字节顺序?
更新:似乎没有单行代码。单独更改字节顺序就是这样做的方法! Mats和其他地方(例如here)讨论了如何做到这一点。
答案 0 :(得分:1)
您需要单独反转每个值。所以这样的事情会起作用:
#include <iostream>
#include <fstream>
int main()
{
const int n = 34;
float mainvector[n];
std::ifstream inputfile;
for(int i = 0; i < n; i++)
{
unsigned char temp[sizeof(float)];
inputfile.read(reinterpret_cast<char*>(temp), sizeof(float));
unsigned char t = temp[0];
temp[0] = temp[3];
temp[3] = t;
t = temp[1];
temp[1] = temp[2];
temp[2] = t;
mainvector[i] = reinterpret_cast<float&>(temp);
}
}
您可以使用某种形式的内置函数来交换订单,但这会使编译器具体...
答案 1 :(得分:0)
Unix系统有routines for this(其他系统也可以)。代码显示在this answer中。您的编译器必须支持类型别名(以便对float的引用可以转换为对int的引用,反之亦然)。