2012-01-02 23 views
9

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?

+3

Usa un sindicato .... –

+1

@Paul: En realidad, la mejor respuesta hasta ahora, es una pena solo un comentario :) –

+3

@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

Respuesta

16

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 
+1

¿No debería ser '& a'? –

+0

De hecho, gracias por detectar. –

+0

¿No debería ser 'sizeof a'? :) – unwind

8

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.

16

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.

+2

+1 para señalar que el enfoque típico no es seguro e invoca UB por ** dos ** motivos. –

+1

@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. –

+2

+1 para usar 'sizeof d'. :) – unwind

Cuestiones relacionadas