我不确定如何使用hton()
。理论上,任何发送到网络上的数据都应该采用网络字节(即大端)格式。假设客户端A支持大端,而B支持小端。我正在从A向B发送多字节数据,那么在网络中我们需要使用htonl()
和htons()
将数据转换为网络字节顺序。由于客户端A已经是大端,所以htonl()
和htons()
返回相同的输出。但是B是小端,因此这些函数会颠倒顺序。鉴于此,当大端和小端机器需要通信时,我们如何说遵循共同的格式(即大端)是一种解决问题的方法?
0x44332211
通过网络发送时,始终呈现为44 33 22 11
。发送方的htonl()
确保它们要么反转字节顺序(在LE机器上),要么只是按原样保留(在BE机器上)。接收方使用ntohl()
将44 33 22 11
转换为0x44332211
,同样地,无论是反转还是按原样保留。{hton,ntoh}{l,s}()
函数以便更好地进行可移植编程:无论程序在LE还是BE机器上运行,它们总是按照应该工作的方式工作。因此,即使在BE机器上也应调用这些函数,即使它们是noop。0x44332211
发送给B(LE)。
44 33 22 11
的形式拥有该数字。htonl()
,因为程序被编写成可移植的。44 33 22 11
并通过网络发送。44 33 22 11
并通过ntohl()
将其转换为数字。ntohl()
从44 33 22 11
获取由11 22 33 44
表示的值,然后将其放入相应的变量中-结果为所需的0x44332211
。0x44332211
。htonl()
,以便数字作为44 33 22 11
发送到网络。这是通过反转或保留来决定主机B的字节顺序。44 33 22 11
并通过ntohl()
将其转换为数字。此功能是否反转取决于主机B的字节顺序。0x44332211
值。00 00 00 04
。另一个机器将其表示为04 00 00 00
,但无论如何,它们仍将视其为4--如果您将1添加到其中,您将得到00 00 00 05
和05 00 00 00
。存在hton
/ntoh
函数的原因是没有办法查看一个数字并知道它是大端还是小端,因此接收方无法确定如何解释字节。44 33 22 11
,B 将读取 44 33 22 11
,并且需要知道这些字节的字节序(它知道所有网络数据都是大端序)。由于 B 是小端主机,它将翻转字节并将 11 22 33 44
存储在内存中,这代表与 A 的 44 33 22 11
相同的数字,因为 A 和 B 解释数字的方式不同。 - Michael Mrozek11 22 33 44
在大端和小端都是一个有效的数字。在大端中,它转换为十进制数287454020;在小端中,它是1144201745。系统需要知道数字所在的字节序,才能确定其实际值。 - Michael Mrozekntohl()
。在某些机器上,它可能是无操作的;在其他机器上,它需要一些位操作。 - Jonathan Leffler
44 33 22 11
是如何发送的:我们首先发送11,然后是22,33,44(从左到右发送流的自然视图),因此接收者会先收到11,然后是22,33,44,还是反过来?另外,当我们发送像0x78
这样的字节时,它在二进制中是0111_1000
,我们是否从最右边的位开始发送? - mercury011444 33 22 11
。关于位顺序,作为程序员,您不必担心它,因为它可能因技术而异。 - glglgl