不幸的是,并不是所有的计算机都以相同的顺序存储包含多字节值的字节。考虑一个由2个字节组成的16位internet。有两种方法来存储这个值。
Little Endian − 在这种方案中,低阶字节存储在起始地址(A)上,高阶字节存储在下一个地址(A + 1)上。
Big Endian - 在这种方案中,高阶字节存储在起始地址(A)上,低阶字节存储在下一个地址(A + 1)上。
为了允许使用不同字节顺序约定的机器相互通信,Internet协议为在网络上传输的数据指定了规范的字节顺序约定。这就是所谓的网络字节顺序。
在建立Internet套接字连接时,必须确保sockaddr_in结构的sin_port和sin_addr成员中的数据是以网络字节顺序表示的。
Byte Ordering Functions
在主机的内部表示和网络字节顺序之间转换数据的例程如下
htons() Host to Network Short
htonl() Host to Network Long
ntohl() Network to Host Long
ntohs() Network to Host Short
下面列出了关于这些函数的更多细节
unsigned short htons(unsigned short hostshort) − 该函数将16位(2字节)数量从主机字节顺序转换为网络字节顺序。
unsigned long htonl(unsigned long hostlong) − 将32位(4字节)的数量从主机字节顺序转换为网络字节顺序。
unsigned short ntohs(unsigned short netshort) − 此函数将16位(2字节)数量从网络字节顺序转换为主机字节顺序。
unsigned long ntohl(unsigned long netlong) − 将32位的数量从网络字节顺序转换为主机字节顺序。
这些函数是宏,并导致将转换源代码插入到调用程序中。在little-endian计算机上,代码将根据网络字节顺序更改值。在big-endian机器上,不需要插入代码,因为不需要;这些函数被定义为null。
确定主机字节顺序的程序
将以下代码保存在byteorder.c文件中,然后编译它并在您的机器上运行它。
在本例中,我们将两个字节的值0x0102存储在短整数中,然后查看两个连续的字节c[0](地址A)和c[1](地址A + 1),以确定字节顺序。