假设 A 是 BE 机器,正在发送 0x44332211 向 LE 机器 B 发送数据。默认情况下,A 将使用 0x44332211 的 htonl,它只不过是 0x44332211。
现在当0x44332211到达B时,B知道它是BE格式,因此B将使用htonl函数翻转并将其更改为0x11223344。
这个翻转是什么意思?我从互联网上读到这个概念。为什么存放前需要翻转?
因为在这种情况下,翻转值 0x11223344 将像 0x44332211 一样存储在 LE 中,这与 A 发送的内容不同,因为 B 对它的解释不同,尽管它们看起来很相似?
/* 从 BE 到 LE 的转换 */
答案1
大端 C 库中的htonl()
和函数实际上不执行任何操作(它们是“无操作”)。ntohl()
这样相同的代码可以在BE和LE机器上使用;在 LE 机器上使用 C lib 编译时,这些函数将翻转字节,但在 BE 机器上,它们将使它们保持不变,因为网络字节顺序是大端字节序,并且主机已经是大端字节序。
换句话说,在您的示例中,BE 机器 A 永远不会更改任何内容。只有 LE 机器 B 可以。
答案2
实际上,以特定方式存储之前并不需要翻转。这是必需的,因为主机使用小端顺序,因此当它从网络接收到长于一个字节的数字时,它会翻转字节以正确解释该数字。在将数据用于任何目的之前,有必要进行这种翻转。
打个比方,想象一下你自己正在阅读一本以原始日本方式印刷的漫画(即通常是最后一页的实际上是第一页)。如果你不知道这个事实,也不“翻”书,你就无法理解这个故事。