您的位置:首页 > 理论基础 > 计算机网络

主机字节序和网络字节序

2017-11-03 10:10 197 查看
字节序分为大端字节序和小端字节序。大端字节序是指一个整数的高位字节(23~31bit)存储在内存的低地址处,地位字节(0~7bit)存储在内存的高地址处。小端字节序则相反,整数的高位字节存放在内存的高地址处,低位字节存放在内存的低地址处。如下图所示:



那么,如何判断是大端字节序还是小端字节序呢?

bool IsLittle()
{
short a=1;
return *(char*)&a == 1;
}

bool IsBig()
{
union
{
short a;
short b;
}ua;
ua.a=1;
return ua.b != 1;
}


现代PC大多采用小端字节序,因此小端字节序又被称为主机字节序。当数据在两台使用不同字节序的主机之间进行数据传递时,必然会发生错误。解决办法是:发送端总要把发送的数据转化成大端字节序再发送,而接收方知道传过来的是大端字节序,根据自身采用的字节序进行转换。因此,大端字节序也称为网络字节序。

Linux提供了4个函数完成主机字节序和网络字节序的转化:

#include<netinet/in.h>

unsigned long int htonl(unsigned long int hostlong);

unsigned short int htons(unsigned short int hostshort);

unsigned long int ntohl(unsigned long int netlong);

unsigned short int ntohs(unsigned short int netshort);

htonl表示“host to network long”,即将长整型的主机字节序转换成网络字节序数据,以此类推。长整型函数通常用来转换IP地址,短整型函数用来转换端口号。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: