主机字节序:整数在内存中保存的顺序
两种方式:
Little endian 将低序字节存储在起始地址
Big endian 将高序字节存储在起始地址
网络字节序:整数在网络中的发送顺序
标准规定
Big endian 首先发送高位字节
字节序转换函数
htonl: 转换long类型到网络字节序
htons: 转换short类型到网络字节序
ntohl: 转换网络字节序到long类型
ntohs: 转换网络字节序到short类型
inet_addr: 将字符串格式IP转换到网络字节序
inet_ntoa: 将网络字节序格式IP转换到字符串
举例:SOCKADDR_IN中的数据格式
SOCKADDR_IN addr;
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(5120);
addr.sin_family = AF_INET;
该结构体中的成员sin_addr, sin_port使用的是网络字节序
sin_addr:
inet_addr()返回的已经是网络字节序
127.0.0.1 --> 0x7F.00.00.01
-> 01 低位
00
00
7F 高位
sin_port:
5120(0x1400)在内存中的布局是
00 低位
14 高位
经过htons处理后
14 低位
00 高位
个人理解:重要的是标准
其实这个转换要解决的问题是网络上各个主机中数据类型的兼容问题。
假设有两个主机A和B,A主机采用了LE字节序,B主机采用了BE字节序,
那么整数0x12345678在A主机中的表示是
低位--------->高位
0x 78 56 34 12
如果不进行字节序变换A将这个数发给B主机时,B主机收到后在的数保存了内存布局,
将这个数解释为 0x78563412 就会出现错误