在网络上发送号码时是否必须反转字节顺序?

时间:2011-11-17 19:19:39

标签: c

在Web上的大多数示例中,作者通常在从主机字节顺序向网络字节顺序发送数字之前更改字节顺序。然后在接收端,作者通常将命令从网络字节顺序恢复为主机字节顺序。

Q1:考虑到两个系统的体系结构是未知的,如果作者在反转字节顺序之前只是检查机器的字节顺序会不会更有效?

Q2:是否真的有必要颠倒数字的字节顺序,即使它们被传递给&收到同一台机器架构?

7 个答案:

答案 0 :(得分:8)

通常,您无法了解远程系统的体系结构。如果每个人都使用特定的字节顺序 - network byte order,那么就没有混淆。所有逆转都需要一些成本,但重新设计所有网络设备的成本会更高。

A1:假设我们要尝试建立远程系统的字节顺序。我们需要在系统之间建立通信并确定远程系统具有的字节顺序。如何在不知道字节顺序的情况下进行通信?

A2:如果您知道两个系统具有相同的体系结构,那么您不需要在每一端都反转字节。但是,一般来说,你不知道。如果你设计了这样的系统,那么你做出了一个网络架构决策,将来排除不同的CPU架构。考虑Apple从86k切换到PPC到x86。

答案 1 :(得分:3)

A1:不,那就是重点。您不希望在另一端关心机器的终结性。在大多数情况下(在严格的,受控制的环境之外......绝对不是互联网)你不会知道。如果每个人都使用相同的字节顺序,则不必担心它。

A2:不会。除非最终不会出现这种情况并且一切都会破裂,否则有人会想知道为什么没有遵循一个众所周知的最佳实践。通常这将是签署薪水的人。

答案 2 :(得分:2)

小或大的Endian是特定于平台的,但对于网络通信,它通常具有大字节序,请参阅wiki

答案 3 :(得分:1)

Q1:是的,如果发件人和&接收者测试了他们的结束(更确切地说,他们相互沟通他们的结束,并测试它是否相同)。

Q2:不,并不总是需要使用“标准”字节顺序。但是对于想要可移植地进行互操作的代码来说更简单。

然而,编码的简易性可能比通信性能更重要 - 网络的成本远远超过交换字节,除非您拥有大量数据。

了解serialization,例如this question我的回答

答案 4 :(得分:1)

它不是盲目逆转。 所有网络都在大端上工作。我的电脑[linux + intel i386]在小端工作。所以当我为我的电脑编码时,我总是颠倒顺序。我认为mac工作在大端。一些手机平台也在。

答案 5 :(得分:1)

网络字节顺序是big-endian。如果发送或接收体系结构也是big-endian,则可以跳过该端的步骤,因为转换为nop。但是,为什么要这么麻烦?翻译所有内容更简单,更安全,并且几乎没有性能影响。

答案 6 :(得分:1)

如果使用ntohl()和htonl()等函数/宏,则无需测试字节序。在大端机器上,它们已经是无操作的。