我有一个带有许多标头和浮点数据的二进制文件格式。我正在研究解析二进制文件的代码。阅读标题并不难,但是当我尝试阅读数据时,我遇到了一些困难。
我打开文件并读取以下内容:
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;
}
可悲的是,结果似乎不正确。我做错了什么?
编辑:忘了提到,二进制数据位于大型中,但是如果我将TMP值打印出数据,则数据似乎并不正确。
结论: 4字节IBM浮点与 float。
有几件事要考虑:
-
第一个,我不能100%确定这是否会有所作为,但是您正在为标题
char textHeader[3200];
使用一系列字符。也许您可以尝试将其更改为unsigned char
的数组... -
我认为,第二个问题可能是更大的问题,在您的
readData
功能本身内,必须做更多的问题。您正在该功能堆栈框架上创建floats
的本地临时std::vector
。然后,您正在返回它。返回甚至不是通过参考或指针,因此这也将创建不必要的副本,但是到下一个代码试图使用此向量的时候,由于该功能已经超出了范围,因此临时性已经被销毁。对于此问题,我可能建议更改此功能的声明和定义。我会从您当前拥有的内容中更改它:
vector<float> readData(int sampleSize)
:
void readData( int sampleSizes, std::vector<float>& data )
- 第三个可能是用户
RetiredNinja
在您最初写这篇文章的评论中以您的评论中提及的三个中最重要的第三个。存储。这也可能是一个主要因素。我认为实际存储在内存中的实际数据表示形式是这里最大的问题。
根据您的文档表示将其存储为4字节的IBM浮点类类型,并且它位于Big Endian中;我发现IBM可能对您有帮助。