Как преобразовать байтовый массив в двойной в C? - PullRequest
9 голосов
/ 02 января 2012

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

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

Ответы [ 3 ]

17 голосов
/ 02 января 2012

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

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

memcpy(&d, buf, sizeof d);

Обратите внимание, что решение, подобное:

d = *((double *) buf);

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

17 голосов
/ 02 января 2012

Попробуйте:

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
9 голосов
/ 02 января 2012

В C ++:

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

#include <algorithm>

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

В С:

#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 на самом деле является массивом, а не просто указателем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...