【问题标题】:c++ read (big endian) binary float [duplicate]c ++读取(大端)二进制浮点数[重复]
【发布时间】:2013-10-05 13:24:31
【问题描述】:

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

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

stackoverflow 本身有很多关于字节序和转换的讨论。然而,这是我第一次处理字节序问题,所有可用的信息都有点压倒性。在这个过程中,我了解到字节是颠倒的(大端与小端)。

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

更新:似乎没有唯一的办法。单独更改字节顺序是这样做的方法! Mats 和其他地方(例如here)在此处讨论了如何做到这一点。

【问题讨论】:

    标签: c++ floating-point binary endianness


    【解决方案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);
        }
    }
    

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

    【讨论】:

    • 我以为reinterpret_cast 只能转换为指针类型...
    • @0x499602D2:我刚刚编辑的代码使用带有 -Wall 的 gcc 4.6.3 编译 - 它抱怨没有使用 mainvector,但除此之外没有问题。我无法测试它,因为我没有“大端浮点文件”。
    • @Mats:工作,包括。 'reinterpret_cast' 的用法。
    • unsigned char temp[sizeof(float)] 缓冲区不保证任何特定对齐,因此在相当多的 CPU 上,mainvector[i] = reinterpret_cast&lt;float&amp;&gt;(temp) 将使用 SIGBUS 或类似的。有许多替代方案/解决方法,包括使用更大的缓冲区和使用std::align 在其中找到适当对齐的偏移量。
    【解决方案2】:

    Unix 系统有routines for this(其他系统也有)。代码显示在this answer。您的编译器必须支持类型别名(以便对 float 的引用可以转换为对 int 的引用,反之亦然)。

    【讨论】:

    • 您与例程的链接似乎不相关...也许this 是您的意思。
    猜你喜欢
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 2015-06-01
    • 1970-01-01
    相关资源
    最近更新 更多