如何在C中将字节数组转换为double?

bet*_*eta 9 c c++ arrays type-conversion

我有一个包含8个字节的字节数组,并希望转换并将它们用作双精度二进制浮点数.

有人可以告诉我如何转换它?

Ada*_*man 17

试试这个:

double a;
memcpy(&a, ptr, sizeof(double));
Run Code Online (Sandbox Code Playgroud)

ptr指向字节数组的指针在哪里.如果你想避免复制使用联盟,例如

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


oua*_*uah 17

这是一个使用memcpy函数的解决方案:

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

memcpy(&d, buf, sizeof d);
Run Code Online (Sandbox Code Playgroud)

请注意,解决方案如:

d = *((double *) buf);
Run Code Online (Sandbox Code Playgroud)

应该避免.这是未定义的行为,因为它可能违反对齐和别名规则.

  • +1表示典型方法不安全,并因****原因调用UB. (3认同)
  • @LokiAstari`sizeof`是一个运算符而不是函数.当操作数是表达式时,这是`sizeof`的C语法.括号是不必要的.但是如果你使用带有类型名称操作数的`sizeof`,它们是synatx所必需的. (2认同)

Ker*_* SB 9

在C++中:

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

#include <algorithm>

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

在C:

#include <string.h>

/* ... */
memcpy(&x, buf, sizeof(double));
Run Code Online (Sandbox Code Playgroud)


在C++ 11中,您还可以使用std::begin(buf)std::end(buf)作为边界(包括标题<iterator>),并且在两种语言中都可以使用sizeof(buf) / sizeof(buf[0])(或简单地sizeof(buf))表示大小,所有提供buf的实际上都是数组,而不仅仅是指针.