C ++读取(大端序)二进制浮点数

c++ read (big endian) binary float

本文关键字:二进制 浮点数 读取      更新时间:2023-10-16

我有一个包含 n 个单精度值的二进制文件。我知道写入数据时使用的格式是大端序。当我将数据读入浮点向量(下面代码中的"主向量"(时,默认情况下,数据是根据小端格式读取的。我使用以下方法来读取数据:

ifstream inputfile("filepath",ifstream::in|ifstream::binary)
inputfile.read(reinterpret_cast<char*>(&mainvector[0]), n*4);
inputfile.close()

关于堆栈溢出本身的字节序和转换有很多讨论。但是,这是我第一次必须处理字节序问题,所有可用的信息都有点压倒性。在这个过程中,我了解到字节是相反的(大端与小端(。

是否有我可以合并的单行代码来将二进制数据的默认小端序处理更改为大端序,或者对我的主向量进行后处理以获取原始数据? 还是我需要手动反转每个 n 个值的字节顺序?

更新:似乎没有单行本。单独更改字节顺序是这样做的方法!如何做到这一点由 Mats 和其他地方(例如这里(讨论。

您需要单独反转每个值。所以这样的事情会起作用:

#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);
    }
}

您可以使用某种形式的内置函数来交换顺序,但这会使它特定于编译器......

Unix系统有这方面的例程(其他系统也可能(。代码显示在此答案中。编译器必须支持类型别名(以便对浮点数的引用可以强制转换为对 int 的引用,反之亦然(。