我正在分析以二进制格式接收的数据包。我必须对积分进行字节顺序转换,但这对我来说有点奇怪,因为浮点数在没有转换的情况下似乎可以很好地工作。浮点数总是按照小端字节顺序排列吗?为什么我们在arpa/inet或其他Unix网络库中没有ntof或ntod函数?
为什么浮点数字没有可用的字节顺序转换方法?
由于发出NaNs信号,具有翻转字节顺序的表示根本无法放入浮点变量中。
要对浮点值进行字节顺序转换,请从输入读取到整数类型或非类型(例如std::byte
数组(缓冲区,使用在此类缓冲区上工作的字节交换操作,并仅在更正字节顺序后重新解释为浮点值。
对于输出,首先将其重新解释为缓冲区,然后对缓冲区(没有浮点类型(进行字节顺序交换。
浮点数是否总是以小端字节顺序排列?
否。
为什么我们在arpa/inet或其他Unix网络库中没有
ntohf
或ntohd
函数?
任何标准协议中的数据包都不包含浮点数。网络库提供ntohs
和ntohl
不是为了方便地操作应用程序数据,而是为了操作头字段,如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位对准。