Tengo una matriz de bytes que contiene 8 bytes y me gustaría convertirlos y usarlos como un número de punto flotante binario de precisión doble.¿Cómo convertir una matriz de bytes en doble en C?
¿Podría alguien decirme cómo convertirlo?
Tengo una matriz de bytes que contiene 8 bytes y me gustaría convertirlos y usarlos como un número de punto flotante binario de precisión doble.¿Cómo convertir una matriz de bytes en doble en C?
¿Podría alguien decirme cómo convertirlo?
Prueba esto:
double a;
memcpy(&a, ptr, sizeof(double));
donde ptr
es el puntero a la matriz de bytes. Si desea evitar la copia, use una unión, p.
union {
double d;
char bytes[sizeof(double)];
} u;
// Store your data in u.bytes
// Use floating point number from u.d
¿No debería ser '& a'? –
De hecho, gracias por detectar. –
¿No debería ser 'sizeof a'? :) – unwind
En C++:
double x;
char buf[sizeof(double)]; // your data
#include <algorithm>
// ...
std::copy(buf, buf + sizeof(double), reinterpret_cast<char*>(&x));
En C:
#include <string.h>
/* ... */
memcpy(&x, buf, sizeof(double));
En C++ 11, también se puede utilizar std::begin(buf)
y std::end(buf)
como los límites (incluye el encabezado <iterator>
), y en ambos idiomas puede usar sizeof(buf)/sizeof(buf[0])
(o simplemente sizeof(buf)
) para el tamaño, todo provisto buf
es en realidad una matriz y no solo un puntero.
Aquí es una solución utilizando memcpy
función:
double d = 0;
unsigned char buf[sizeof d] = {0};
memcpy(&d, buf, sizeof d);
Tenga en cuenta que una solución como:
d = *((double *) buf);
shoud ser evitado. Este es un comportamiento indefinido porque potencialmente infringe las reglas de alineación y aliasing.
+1 para señalar que el enfoque típico no es seguro e invoca UB por ** dos ** motivos. –
@R .: en realidad solo hay una * razón * (es decir, "porque el estándar así lo dice"), pero de hecho es bueno saber las trampas reales que pueden ocasionar las emisiones imprudentes. –
+1 para usar 'sizeof d'. :) – unwind
Usa un sindicato .... –
@Paul: En realidad, la mejor respuesta hasta ahora, es una pena solo un comentario :) –
@PaulTomblin, tal vez todas las otras personas sugirieron que esto debería formar una unión y protestar contra este particular usar un comportamiento indefinido – avakar