2012-01-02 5 views
9

저는 8 바이트를 포함하는 바이트 배열을 가지고 있으며이를 변환하여 배정도 이진 부동 소수점 숫자로 사용하고 싶습니다.C에서 바이트 배열을 double로 변환하는 방법은 무엇입니까?

누군가 변환 방법을 알려주시겠습니까?

+3

노조를 사용하십시오. –

+1

@Paul : 사실 지금까지 가장 좋은 대답은 여기까지입니다. –

+3

@PaulTomblin, 아마도이 모든 사람들은이 특정 집단에 대한 노조와 저항을 형성해야한다고 주장합니다. 정의되지 않은 동작을 사용합니다. – avakar

답변

16

이 시도 : ptr이 바이트 배열에 대한 포인터입니다

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

. 복사를 피하려면 유니언을 사용하십시오. C++에서

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

은 '& a'가 아니어야합니까? –

+0

실제로, 발견에 감사드립니다. –

+0

'sizeof a'가 아니겠습니까? :) – unwind

8

: C++ 11에서

#include <string.h> 

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


, 당신은 또한 포함 (경계로 std::begin(buf)std::end(buf)를 사용할 수 있습니다 C에서

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

#include <algorithm> 

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

헤더 <iterator>), 두 언어 모두에서 다음을 사용할 수 있습니다. sizeof(buf)/sizeof(buf[0]) (또는 간단하게 sizeof(buf)) 크기는 모두 buf입니다. 실제로는 포인터가 아니라 배열입니다.

d = *((double *) buf); 

피할 수 없을시 : 추천 용액 것을

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

memcpy(&d, buf, sizeof d); 

참고

16

여기 memcpy 함수를 사용하여 하나의 해결책이다. 정렬 및 앨리어싱 규칙을 위반할 수 있으므로 정의되지 않은 동작입니다.

+2

+1은 일반적인 접근 방법이 안전하지 않으며 ** 두 가지 ** 이유로 UB를 호출 함을 지적합니다. –

+1

@R : 사실은 하나의 * reason * (즉 "표준이 그렇게 말하기 때문에")이지만 무모한 주조로 인해 발생할 수있는 실제 함정을 아는 것이 좋습니다. –

+2

+1은 'sizeof d'를 사용합니다. :) – unwind

관련 문제