我最近很喜欢阅读Beej 的网络编程指南。在第 7.4 节中,他谈到了与发送浮点数相关的问题。他提供了一个简单(且幼稚)的解决方案,通过将它们转换为uint32_t
's 来“打包”浮动:
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;
}
float ntohf(uint32_t p)
{
float f = ((p>>16)&0x7fff); // whole part
f += (p&0xffff) / 65536.0f; // fraction
if (((p>>31)&0x1) == 0x1) { f = -f; } // sign bit set
return f;
}
我应该在发送之前htonf
通过标准运行打包的浮点数(即 的结果)htons
吗?如果没有,为什么不呢?
据我所知,Beej 没有提到这一点。我问的原因是,如果数据在发送之前没有转换为网络字节顺序,我无法理解接收机器如何可靠地重建uint32_t
要传递给(“解包器”)的 s 。ntohf