在Web上的大多数示例中,作者通常会在将数字从主机字节顺序转换为网络字节顺序之前更改字节顺序。然后在接收端,作者通常会将顺序恢复回来从网络字节顺序到主机字节顺序。
Q1:考虑到两个系统的架构未知,如果作者在反转字节顺序之前简单地检查机器的字节顺序,那么效率会更高吗?
Q2:即使数字被传递给和接收自相同的机器架构,是否真的有必要反转它们的字节顺序?
在Web上的大多数示例中,作者通常会在将数字从主机字节顺序转换为网络字节顺序之前更改字节顺序。然后在接收端,作者通常会将顺序恢复回来从网络字节顺序到主机字节顺序。
Q1:考虑到两个系统的架构未知,如果作者在反转字节顺序之前简单地检查机器的字节顺序,那么效率会更高吗?
Q2:即使数字被传递给和接收自相同的机器架构,是否真的有必要反转它们的字节顺序?
一般情况下,你无法知道远程系统的架构。如果每个人都使用特定的字节顺序 - 网络字节顺序,那么就不会有混淆。所有反转的成本都是一些代价,但重新设计所有网络设备的代价将远远超过这些。
A1:假设我们要尝试建立远程系统的字节顺序。我们需要在系统之间建立通信,并确定远程系统的字节顺序。在不知道字节顺序的情况下,我们如何进行通信?
A2:如果您知道两个系统具有相同的架构,则不需要在每个端口反转字节。但是,总体而言,你并不知道。如果您确实设计了这样的系统,则已经做出了一项网络架构决策,该决策排除了将来不同的CPU架构。考虑苹果从86k到PPC再到x86的转换。
<endian.h>
。 - Basile Starynkevitch这不是盲目反转的问题。 所有网络都使用大端字节序。我的电脑[linux + intel i386]使用小端字节序。所以当我为我的电脑编写代码时,我总是需要反转顺序。我认为Mac也使用大端字节序。一些移动电话平台也是如此。
网络字节顺序是大端序。如果发送或接收架构也是大端序,您可以跳过该端上的步骤,因为翻译相当于 nop。然而,为什么要麻烦呢?翻译一切更简单、更安全,并且几乎没有性能影响。
如果您使用 ntohl()、htonl() 等函数/宏,就不需要测试字节序。在大端机器上,它们已经是无操作。