我从其中一个答案中阅读了文档:
ntohs函数采用TCP/IP网络字节顺序( AF_INET或AF_INET6地址族)的16位数字,并返回主机字节顺序的16位数字。
请举例说明,什么是网络字节顺序,什么是主机字节顺序。
发布于 2013-04-08 20:28:25
数字1000在二进制中是1111101000。
如果是16位二进制数,则为0000001111101000。
如果将其拆分为两个8位字节,则为两个字节,其值分别为00000011和11101000。
这两个字节可以有两种不同的顺序:
在字节可寻址的机器中,硬件可以是“大端”或“小端”,这取决于哪个字节存储在内存中较低的地址。大多数个人计算机采用小端;较大的计算机有大端和小端两种类型,一些较大的计算机(例如IBM大型机、中型计算机和SPARC服务器)采用大端。
大多数网络都是位串行的,因此位是一个接一个地传输的。字节的位可能会先传输最高有效位或最低有效位,但网络硬件会对处理器隐藏这些细节。但是,它们将按照字节在主机内存中的顺序传输字节,因此,如果小端机器向大端机器传输数据,则小端机器传输的数字在接收大端机器上看起来不同;这些差异不会被网络硬件所隐藏。
因此,为了允许大端和小端机器进行通信,在每个协议层,可以:
各种Internet协议使用第一种策略,将big-endian指定为字节顺序;在各种RFC中,它被称为“网络字节顺序”。(Microsoft的SMB文件访问协议也使用第一种策略,但指定了小端。)
所以“网络字节顺序”是大端的。“主机字节顺序”是您正在使用的机器的字节顺序;它可以是大端的,在这种情况下,ntohs()
只返回您给它的值,也可以是小端的,在这种情况下,ntohs()
交换您给它的值的两个字节并返回那个值。例如,在大端机器上,ntohs(1000)
将返回1000,而在小端机器上,ntohs(1000)
将交换高位字节和低位字节,以二进制表示1110100000000011或以十进制表示59395。
https://stackoverflow.com/questions/15875282
复制