2012-01-09 2 views
1

네트워크에서 부동 소수점 숫자의 직렬화를 수행하는 코드 조각을 발견했습니다.네트워크에서 부동 소수점 숫자의 직렬화를 수행하는 방법은 무엇입니까?

uint32_t htonf(float f) 
{ 
    uint32_t p; 
    uint32_t sign; 

    if (f < 0) { sign = 1; f = -f; } 
    else { sign = 0; } 

    p = ((((uint32_t)f)&0x7fff)<<16) | (sign<<31); // whole part and sign 
    p |= (uint32_t)(((f - (int)f) * 65536.0f))&0xffff; // fraction 

    return p; 
} 

규격 : 상기 코드는 32 비트의 수를 저장하는 플로트 원래 구현의 일종이다. 상위 비트 (31)는 숫자의 부호 ("1"은 음수)를 저장하는 데 사용되고 다음 7 비트 (30-16)는 부동 소수점의 정수 부분을 저장하는 데 사용됩니다. 마지막으로 나머지 비트 (15-0)는 숫자의 분수 부분을 저장하는 데 사용됩니다.

기타는 괜찮지 만 이것이 의미하는 바를 알 수는 없습니다. 이게 어떻게 우리에게 15-0 비트를 줄까요? 왜 "* 65536.0f"가 필요한가요?

p |= (uint32_t)(((f - (int)f) * 65536.0f))&0xffff 

누구나 설명 할 수 있습니까?

+1

달성하려는 목표는 무엇입니까? 양끝의 머신이 같은 포맷을 사용하거나 다른 머신을 처리하고 싶다면이 작업을 원합니까? 첫 번째 경우 비트를 전송하십시오. 두 번째 방법에서는 정수와 배율 인수를 명시 적으로 전송하고 수신 측에서 float로 다시 구성해야합니다. –

답변

5
f - (int)f 

당신에게 숫자의 소수 부분을 제공합니다. 이 분수를 16 비트로 저장하려고하므로 분모로 2^16 인 분수로 생각하십시오. 분자는 다음과 같습니다.

(f - (int)f) * 65536.0f) 

나머지는 32 비트 수의 오른쪽 비트로 비트를 이동하기 위해 사용됩니다. 그런 다음 32 비트 정수가 다른 32 비트 int와 마찬가지로 네트워크에서 직렬화되며, 아마도 위의 루틴과 반대가 부동 소수점 숫자를 다시 만드는 데 사용됩니다.

-1

공용체를 사용할 수 있습니다.

uint32_t htonf(float f) 
{ 
    union { 
     float f1; 
     uint32_t i1; 
    }; 
    f1 = f; 
    return i1; 
} 
+0

OP 질문에 응답하지 않습니다. – greydet

관련 문제