C ++读取(大端序)二进制浮点数
c++ read (big endian) binary float
我有一个包含 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 的引用,反之亦然(。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 浮点数为 32 位和 64 位二进制表示形式
- 将整数的二进制数据转换为浮点数
- 将浮点数向量转换为十六进制/二进制字符串
- 了解浮点数的二进制表示形式
- 为什么我无法从 std::stringstream 二进制流中获得全精度(双精度、浮点数)
- 浮点数的二进制相等比较是否正确
- 有没有办法更有效地将二进制双精度从文件读取到浮点数组中
- 给定二进制随机数生成器生成随机浮点数的正确方法
- C ++读取(大端序)二进制浮点数
- 从二进制读取 2D 浮点数组,从 char* 转换为浮点数[2]
- 将有符号整数转换为二进制浮点数,比反运算成本低
- C++到C#将二进制文件读取到二维浮点数组中
- 二进制32浮点数(IEEE)的前导位
- 如何用ifstream和istreambuf_iterator读取二进制文件作为浮点数
- 正确(独立于32位/64位)将浮点数保存为二进制流
- 用c++从二进制字符串生成浮点数
- 模板浮点数的二进制搜索
- 将持有二进制的字符串转换为浮点数