1

フォーマットが混在するデータを含む配列があります。符号なしintとfloatの両方が含まれています(すべて4バイトのデータに格納されています)。

各4バイトのデータをfloatに変換したいと思います。しかし、どの方法も私にはうまくいきませんでした。例えば。

union
{
   DWORD i;
   float f;
} u; 

この方法は機能しません。また、reinterpret_castをfloatに変換しません。

私が持っているデータはこんな感じです。

{ 1, 8, 1.00000, -1.000000 }

メモリをuint32_t指すポインタがあります。

DWORD value = *(uint_pointer)私に1、8を正しく与え、他のものは与えません。型キャストfloatを使用すると、1.00000と-1.00000は正しく認識されますが、他の2つは認識されません。

基本的に結果を出したい

{ 1.00000, 8.00000, 1.00000, -1.00000 }

以前のすべての回答についてSOを調べましたが、どれも確実に機能しなかったため、いくつかのアイデアを得るためにこれを再度投稿します。

ありがとう

4

1 に答える 1

3

float4バイトのどのストレッチがsであり、4バイトのどのストレッチがsであるかを知る必要がありますuint。わからない場合は、変換する方法はありません。残念ながら、これらは32ビットであり、意味があいまいです。floatただし、たとえば、3番目の値がであることがわかっている場合は、で取得できますfloat v3 = ((float *)uint_pointer)[3]。また、この以前の投稿で私の長い説明をチェックすることができます:AudioFileServicesを使用したiOS6でのグラニュラーシンセシス

編集:値が含まれているのが4バイトであることがわからない場合は、一般的に、ユニオンに== sizeof(DWORD) == sizeof(float)キャストしてアクセスすることができます。u*そうすれば、コンパイラのメモリアライメントの知識を使用するので、v3 = ((u *)uint_pointer)[3].fより安全です。@LightnessRacesInOrbitによるコメントを参照してください。

于 2013-01-17T01:43:24.877 に答える