У меня есть двоичный формат файла с кучей заголовков и данных с плавающей запятой. Я работаю над кодом, который анализирует двоичный файл. Чтение заголовков было несложным, но когда я попытался прочитать данные, я столкнулся с некоторыми трудностями.
Я открыл файл и прочитал заголовки следующим образом:
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 с плавающей запятой — это не то же самое, что число с плавающей запятой.
readData()
вы создаете временный вектор в этом кадре стека функций, а затем возвращаете его. Возможно, попробуйте изменить сигнатуру этой функции, чтобы принятьstd::vector<float>
по ссылке и передать ее в функцию, а не возвращать копию во временную. - person Francis Cugler   schedule 18.02.2019float
. Если это так, вам придется проделать некоторую работу, чтобы преобразовать ввод во что-то, с чем может работать ваше оборудование. - person Pete Becker   schedule 18.02.2019std::cout << std::hex << (int&)(tmp) << std::endl;
- person rustyx   schedule 18.02.2019