2017-01-30 9 views
1

浮動小数点数の配列にバイトの配列を変換する必要があります。私は、ネットワーク接続を介してバイトを取得し、それらを浮動小数点数に解析する必要があります。配列のサイズはあらかじめ定義されていません。 これは、これまでのところ、共用体を使用しているコードです。あなたはそれをより速く走らせる方法について何か提案がありますか?4バイトをC++で浮動小数点に変換する最速の方法

int offset = DATA_OFFSET - 1; 
UStuff bb; 
//Convert every 4 bytes to float using a union 
for (int i = 0; i < NUM_OF_POINTS;i++){ 
    //Going backwards - due to endianness 
    for (int j = offset + BYTE_FLOAT*i + BYTE_FLOAT ; j > offset + BYTE_FLOAT*i; --j) 
    { 
     bb.c[(offset + BYTE_FLOAT*i + BYTE_FLOAT)- j] = sample[j]; 
    } 
    res.append(bb.f); 
} 
return res; 

これは、あなたがC.であなたのコードの動作を、それを行うには許可されているが、あなたは、C++でunionスルーしゃれを入力することはできません、私が使用して組合

union UStuff 
{ 
     float f; 
     unsigned char c[4]; 
}; 
+0

_ "ネットワーク接続を介してバイトを取得し、それらを解析して浮動小数点数に変換する必要があります。"浮動小数点数が異なるコンピュータからのものであれば、浮動小数点数をよりよく定義する必要があります。 –

+0

_ "それをより速く走らせる方法はありますか?" _ SOは最適化サービスではありません! –

+1

"変換"を定義してください。考えられるマッピングはたくさんあります。あなたは "parse"という言葉を使っていますが、あなたのプログラムは解析を行うためにsemを使っていません。 –

答えて

5

技術であります定義されていません。

この重要な動作点を除いて、floatはすべてのマシンで同じ方法で表現されていると仮定していますが、それはそうではありません。 と思うfloatは32ビットIEEE754リトルエンディアンのデータブロックですが、にはがあるとは限りません。

悲しいことに、最高の解決策は、最終的にになります。浮動小数点データの大部分のシリアル化は、文字列から出たり出たりすることによって実行されます。文字列からは、unsigned charデータの配列として表すことができるため、問題がかなり解決されます。だからあなたの唯一の論争は、データのを符号化するを理解することに至りました。仕事が終わった!

+0

IMHO、 '期待どおりに'労働組合を通した型打ちをしないC++コンパイラは壊れています。標準が何を言っているかにかかわらず。 –

+0

@ErikAlapää:私はあなたに同意するつもりです。特に、組合メンバーの1人が 'unsigned char'配列の場合は、 – Bathsheba

+0

興味深いのは、gcc:s may_aliasなどのコンパイラ属性を使用する方法です。 May_aliasは、配列が重複していないと言うために使用される 'キーワードstrict'の逆の並べ替えです。したがって、may_aliasは標準化されているとさらに便利です。そして、CとC++は、それらが使われている「ポータブルアセンブラ」のようなものです。 –

関連する問題