用C ++读取IBM浮点数[重复]

问题描述 投票:-2回答:1

这个问题在这里已有答案:

我有一个带有一堆标题和浮点数据的二进制文件格式。我正在研究解析二进制文件的代码。阅读标题并不难,但当我试图读取数据时遇到了一些困难。

我打开文件并读取标题如下:

ifs.open(fileName, std::ifstream::in | std::ifstream::binary);
char textHeader[3200];
BinaryHeader binaryHeader;
ifs.read(textHeader,sizeof(textHeader));
ifs.read(reinterpret_cast<char *>(&binaryHeader), sizeof(binaryHeader));

文档说数据存储为:4字节IBM浮点数,我尝试了类似的东西:

vector<float> readData(int sampleSize){
    float tmp;
    std::vector<float> tmpVector;
    for (int i = 0; i<sampleSize; i++){
        ifs.read(reinterpret_cast<char *>(&tmp), sizeof(tmp));
        std::cout << tmp << std::endl;
        tmpVector.push_back(tmp);
    }
    return tmpVector;
}

可悲的是,结果似乎并不正确。我做错了什么?

编辑:忘记提及,二进制数据是big-endian,但如果我打印出tmp值,数据似乎不正确。

结论:4字节IBM浮点与浮点数不同。

c++ floating-point binaryfiles binaryreader fileparsing
1个回答
0
投票

有几点需要考虑:

  • 第一个,我不是100%确定这是否会产生影响,但是你正在为你的标题char textHeader[3200];使用一系列字符。也许你可以尝试将其更改为unsigned char数组而不是......
  • 第二个我认为可能是一个更大的问题,必须在性能上做更多的事情在你的readData功能本身。您正在该函数堆栈框架上创建std::vector的本地临时floats。然后你回来了。返回甚至不是通过引用或指针,因此这也将创建不必要的副本,但是当下一段代码尝试使用此向量时,临时已经被破坏,因为该函数已经超出范围。对于这个问题,我可能会建议更改此函数的声明和定义。 我会根据你现在的情况改变它: vector<float> readData(int sampleSize) 对此: void readData( int sampleSizes, std::vector<float>& data )

  • 第三个可能是三个中最重要的一个在用户RetiredNinja的评论中以一个问题的形式提到,因为我最初写这篇文章,曾问过一个关于存储数据类型的字节序的非常好的问题。这也可能是一个主要因素。我认为物理存储在内存中的实际数据表示是最关注的问题。

根据您的文档声明它存储为4字节IBM浮点类型并且它是大端的事实;我发现IBM的specification可能对您有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.