c ++ read(big endian)二进制浮点数

时间:2013-09-29 18:00:16

标签: c++ floating-point binary endianness

我有一个包含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)讨论了如何做到这一点。

2 个答案:

答案 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的引用,反之亦然)。