我無法使下面的代碼正常工作。使用一個在線的IEEE-754轉換器,我寫出了testData.txt文件,該文件用應該表示浮點數75.5的位串讀取;實際的cout.write確實表明位串是我所期望的。然而,當我嘗試使用聯合將char *強制轉換爲浮點數時(正如我所看到的是完成此轉換的典型方法),結果浮點數不是我期望的數字。比特流到浮動類型強制
#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
有一些基本的東西我沒有做這將正確地做這項工作?
我讀過你的回答,它確實完全解決了我的問題,所以非常感謝你。我會把這個標記爲答案,但我想看看Jonathan Leffler在我做之前是否提出了不同的東西。我寧願使用一個字符數組副作爲unsigned long int的解決方案作爲union的另一個成員(因爲不清楚如何將union擴展爲除了float之外的任何其他類型,至少在char []中它是微不足道的)。 – bpw1621 2010-02-18 20:00:34
@bpw:如果使用'char []'存儲位數組,每個'char'對象存儲8位數據。如果使用'long []'存儲位數組,每個'long'對象存儲sizeof(long)* 8位。不幸的是,'bitset'只會向你返回一個'long'的值,所以你基本上被限制在'long [1]'中。這實際上是'bitset'的限制,你需要自己編碼才能解決它。 – Potatoswatter 2010-02-18 20:06:56
@bpw(來自其他線程):至少可以將單個數據包塞入「union」。工會的所有成員都保證有相同的地址。一系列數據包可以是一系列聯合指針進入緩衝區。使用該初始的「int」來確定每個聯合實際是什麼類型的對象...此行爲由C++§9.5/ 1定義並保證安全。但是,不要忘記對每個成員執行endian轉換。 – Potatoswatter 2010-02-18 20:30:12