为什么浮点数字没有可用的字节顺序转换方法?还有,为什么浮点数不用转换就可以工作



我正在分析以二进制格式接收的数据包。我必须对积分进行字节顺序转换,但这对我来说有点奇怪,因为浮点数在没有转换的情况下似乎可以很好地工作。浮点数总是按照小端字节顺序排列吗?为什么我们在arpa/inet或其他Unix网络库中没有ntof或ntod函数?

为什么浮点数字没有可用的字节顺序转换方法?

由于发出NaNs信号,具有翻转字节顺序的表示根本无法放入浮点变量中。

要对浮点值进行字节顺序转换,请从输入读取到整数类型或非类型(例如std::byte数组(缓冲区,使用在此类缓冲区上工作的字节交换操作,并仅在更正字节顺序后重新解释为浮点值。

对于输出,首先将其重新解释为缓冲区,然后对缓冲区(没有浮点类型(进行字节顺序交换。

浮点数是否总是以小端字节顺序排列?

否。

为什么我们在arpa/inet或其他Unix网络库中没有ntohfntohd函数?

任何标准协议中的数据包都不包含浮点数。网络库提供ntohsntohl不是为了方便地操作应用程序数据,而是为了操作头字段,如IP地址和TCP端口号。

如果您确实为自己定义了便利功能,请确保在网络端使用非浮点类型。也就是说,你应该写

uint32_t htonf(float);
float ntohf(uint32_t);
uint64_t htond(double);
double ntohd(uint64_t);

或者可能更好的是,打破标量输入标量输出的约定,将std::span<std::byte, width>用于网络侧。这将解决在将IEEE双精度位表示填充到uint64_t中时可能出现的对准问题,因为标准网络协议仅提供32位对准。

相关内容

  • 没有找到相关文章

最新更新