2012-01-02 25 views
9

私は8バイトを含むバイト配列を持っており、変換して倍精度の2進浮動小数点数として使用したいと考えています。Cでバイト配列をdoubleに変換するには?

変換方法を教えてください。 ptrがあなたのバイト配列へのポインタです

double a; 
memcpy(&a, ptr, sizeof(double)); 

+3

ユニオンを使用してください。 –

+1

@Paul:これまでのところ最良の答えは、恥ずかしい限りです。:) –

+3

@PaulTomblin、多分あなたはこれを示唆している他のすべての人々がこの特定の定義されていない動作を使用します。 – avakar

答えて

16

はこれを試してみてください。コピーを避けたい場合は、ユニオンを使用します。あなたも境界としてstd::begin(buf)std::end(buf)を使用することができますC++ 11では

#include <string.h> 

/* ... */ 
memcpy(&x, buf, sizeof(double)); 


、(含める:C++で

union { 
    double d; 
    char bytes[sizeof(double)]; 
} u; 
// Store your data in u.bytes 
// Use floating point number from u.d 
+1

「&a」ではありませんか? –

+0

実際、スポッティングに感謝します。 –

+0

それは 'sizeof a'ではありませんか? :) – unwind

8

:Cで

double x; 
char buf[sizeof(double)]; // your data 

#include <algorithm> 

// ... 
std::copy(buf, buf + sizeof(double), reinterpret_cast<char*>(&x)); 

ヘッダー<iterator>)、両方の言語で使用できますsizeof(buf)/sizeof(buf[0])(または単にsizeof(buf))のサイズで、すべてbufは実際にはポインタではなく配列です。

d = *((double *) buf); 

避けることshoud:のような解決策があること

double d = 0; 
unsigned char buf[sizeof d] = {0}; 

memcpy(&d, buf, sizeof d); 

注:

16

はここmemcpy機能を使用して1つの解決策です。これは、整列ルールとエイリアスルールに違反する可能性があるため、未定義の動作です。

+2

+1は、典型的なアプローチが危険であることを指摘し、** 2つの**理由のためにUBを呼び出す。 –

+1

@R:実際には、理由が1つしかない(つまり、「標準でそうだと言っているので」)が、無謀なキャスティングが引き起こす実際の落とし穴を知ることは本当に良いことです。 –

+2

+1は 'sizeof d 'を使用します。 :) – unwind

関連する問題