Как преобразовать массив байтов в double в C?

У меня есть массив байтов, содержащий 8 байтов, и я хотел бы преобразовать и использовать их как двоичное число с плавающей запятой двойной точности.

может кто-нибудь сказать мне, как его преобразовать?

3 ответов


попробуйте это:

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

здесь ptr - это указатель на байтовый массив. Если вы хотите избежать копирования, используйте объединение, например

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

вот одно решение, использующее memcpy функция:

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

memcpy(&d, buf, sizeof d);

обратите внимание, что решение как:

d = *((double *) buf);

надо избегать. Это неопределенное поведение, поскольку оно потенциально нарушает правила выравнивания и сглаживания.


В C++:

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

#include <algorithm>

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

В C:

#include <string.h>

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


в C++11, вы также можете использовать std::begin(buf) и std::end(buf) в качестве границ (включая заголовок <iterator>), и на обоих языках, вы можете использовать sizeof(buf) / sizeof(buf[0]) (или просто sizeof(buf)) для размера, предусмотренного buf на самом деле является массивом, а не просто указателем.