私は8バイトを含むバイト配列を持っており、変換して倍精度の2進浮動小数点数として使用したいと考えています。Cでバイト配列をdoubleに変換するには?
変換方法を教えてください。 ptr
があなたのバイト配列へのポインタです
double a;
memcpy(&a, ptr, sizeof(double));
:
私は8バイトを含むバイト配列を持っており、変換して倍精度の2進浮動小数点数として使用したいと考えています。Cでバイト配列をdoubleに変換するには?
変換方法を教えてください。 ptr
があなたのバイト配列へのポインタです
double a;
memcpy(&a, ptr, sizeof(double));
:
はこれを試してみてください。コピーを避けたい場合は、ユニオンを使用します。あなたも境界として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
: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);
注:
はここmemcpy
機能を使用して1つの解決策です。これは、整列ルールとエイリアスルールに違反する可能性があるため、未定義の動作です。
+1は、典型的なアプローチが危険であることを指摘し、** 2つの**理由のためにUBを呼び出す。 –
@R:実際には、理由が1つしかない(つまり、「標準でそうだと言っているので」)が、無謀なキャスティングが引き起こす実際の落とし穴を知ることは本当に良いことです。 –
+1は 'sizeof d 'を使用します。 :) – unwind
ユニオンを使用してください。 –
@Paul:これまでのところ最良の答えは、恥ずかしい限りです。:) –
@PaulTomblin、多分あなたはこれを示唆している他のすべての人々がこの特定の定義されていない動作を使用します。 – avakar