2013-01-17 51 views
1

我有一個數組,其中有數據混合格式。它包含無符號整數&浮點數(每個都以4字節數據存儲)。轉換4字節的數據包含uint和浮動浮動

我想將每個4字節的數據轉換爲浮點數。但是,沒有任何方法爲我工作。例如。

union 
{ 
    DWORD i; 
    float f; 
} u; 

此方法不起作用。 reinterpret_cast也不會浮動。

我擁有的數據就是這樣。

{ 1, 8, 1.00000, -1.000000 } 

我有一個指向內存的指針uint32_t

DWORD value = *(uint_pointer)正確地給我,而不是其他。 使用類型轉換float會導致1.00000 & -1.00000被正確識別,但不會被其他兩個識別。

我基本上希望得到的結果是

{ 1.00000, 8.00000, 1.00000, -1.00000 } 

我看着SO對於以前所有的答案,但他們沒有工作可靠,因此我再次發佈此得到一些想法。

感謝

+2

請格式化您的文章。你已經在這裏差不多兩年了。 –

+0

還解釋了這個問題比「它不工作」 –

+2

Float和int有非常不同的機器表示。除了一些特殊情況,根本無法從字節中確定類型,正如@ s.bandara所指出的那樣。 –

回答

3

你需要知道哪些綿延的4個字節是float S和其中的4個字節舒展uint秒。如果你不知道,就沒有辦法轉換它們,不幸的是,它們只有32位,含義模糊。但是,如果您確實知道第三個值是float,則可以使用float v3 = ((float *)uint_pointer)[3]獲得該值。此外,您可以在此之前的帖子看看我長的解釋:Granular Synthesis in iOS 6 using AudioFileServices

編輯: 如果你不知道它是4個字節== sizeof(DWORD) == sizeof(float)包含你的價值觀,並作爲一般一個很好的做法,你可以投射到u*並從工會訪問它。這樣,您就可以使用編譯器的內存對齊知識,因此v3 = ((u *)uint_pointer)[3].f更安全,請參閱@LightnessRacesInOrbit的評論。

+0

只有當'sizeof float == CHAR_BIT * 4' –

+0

好的,@LightnessRacesInOrbit,我也應該被燒使用C++風格的演員陣容,我已經感受到了火焰舔... –

+0

是的,只是你等待;) –