У меня возникли проблемы с правильной работой следующего кода. Используя онлайн-конвертер IEEE-754, я написал (вручную) файл testData.txt, который считывается с битовой строкой, которая должна означать номер с плавающей точкой 75.5; фактический cout.write действительно показывает, что бит-строка, как я ожидаю, также. Однако, когда я пытаюсь принудить char * к float с помощью объединения (как я видел, это типичный способ выполнить это преобразование), полученный float не является числом, которое я ожидаю.Bitstream to Float Type Coercion
#include<climits>
#include<iostream>
#include<fstream>
#include<bitset>
int main(int, char**)
{
std::ifstream inputFile("testData.txt", std::ios_base::in | std::ios_base::binary);
if(!inputFile) std::cout << "Failed to open input file!" << std::endl;
char buffer[ CHAR_BIT * sizeof(float) ];
inputFile.read(buffer, CHAR_BIT * sizeof(float));
std::cout << "cout.write of input from file = ";
std::cout.write(buffer, CHAR_BIT * sizeof(float));
std::cout << std::endl;
union { float f; char* c; } fToCharStarUnion;
fToCharStarUnion.c = buffer;
std::bitset< sizeof(float) * CHAR_BIT > bits(std::string(fToCharStarUnion.c));
std::cout << "fToCharStarUnion.f = " << fToCharStarUnion.f << " bits = " << bits << std::endl;
inputFile.close();
return 0;
}
Ответный результат работы это:
cout.write of input from file = 01000010100101110000000000000000
fToCharStarUnion.f = -1.61821e+38 bits = 01000010100101110000000000000000
Есть ли что-то фундаментальное я не делаю что сделает эту работу правильно?
Я читал, что вы отвечаете, он полностью исправляет мою проблему, поэтому большое вам спасибо. Я отмечу это как ответ, но я хотел посмотреть, представлял ли Джонатан Леффлер что-то другое, прежде чем я это сделал. Я также предпочел бы использовать решение, в котором был бы массив символов с типом unsigned long int как другой член союза (потому что неясно, как расширить объединение к любому другому типу, чем поплавать мне хотя бы, но в char [] случай тривиален). – bpw1621
@bpw: Если вы используете 'char []' для хранения битового массива, каждый объект 'char' хранит 8 бит. Если вы используете 'long []' для хранения битового массива, каждый 'long'-объект хранит sizeof (long) * 8 бит. К сожалению, 'bitset' будет возвращать вам только бит' long', поэтому вы существенно ограничены 'long [1]'. Это действительно предел 'bitet', и вам нужно будет закодировать свой собственный, чтобы обойти его. – Potatoswatter
@bpw (from other thread): Вы можете замять один пакет в «union», по крайней мере. У всех членов профсоюза гарантируется одинаковый адрес. Серия пакетов может быть последовательностью указателей объединения в буфер. Используйте этот начальный 'int', чтобы определить, какой именно объект каждый союз действительно ... это поведение определено и гарантировано безопасным с помощью C++ §9.5/1. Однако не забудьте выполнить преобразование endian для каждого участника. – Potatoswatter