네트워크에서 부동 소수점 숫자의 직렬화를 수행하는 코드 조각을 발견했습니다.네트워크에서 부동 소수점 숫자의 직렬화를 수행하는 방법은 무엇입니까?
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
누구나 설명 할 수 있습니까?
달성하려는 목표는 무엇입니까? 양끝의 머신이 같은 포맷을 사용하거나 다른 머신을 처리하고 싶다면이 작업을 원합니까? 첫 번째 경우 비트를 전송하십시오. 두 번째 방법에서는 정수와 배율 인수를 명시 적으로 전송하고 수신 측에서 float로 다시 구성해야합니다. –