我有一个带有一堆标题和浮点数据的二进制文件格式。我正在研究解析二进制文件的代码。阅读标题并不难,但当我试图读取数据时遇到了一些困难。
我打开文件并读取标题如下:
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浮点与浮点数不同。
有几点需要考虑:
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可能对您有所帮助。