字节序的概念和示例
CPU向内存保存数据的方式有2种,所以CPU解析数据的方式也分为2种。CPU保存和解析数据的方式叫字节序,分为小端字节序和大端字节序。
大端字节序:高位字节存放到低位地址。
小端字节序:高位字节存放到高位地址。
下边以0x123456(0x表示 这是16进制数,并不是数字中的一部分)为示例用画图的方式说明上边两种定义。
大端字节序(比较符合人类的思维习惯):

小端字节序:

使用网络协议发送数据的两端必须使用同一种字节序,比如要么都使用大端字节序或者都使用小端字节序,否则的话,就像两个不同语言的人进行沟通,造成鸡同鸭讲的尴尬局面。
字节序转换
字节序转换函数有:
unsigned short htons(unsigned short);
unsigned short ntohs(unsigned short);
unsigned long htonl(unsigned long);
unsigned long ntohl(unsigned long);
函数名中字母解释:
n代表的就是network(网络)
h代表的是host(本机)
s表示的是short(16 位整数)
l表示的是long(32 位整数)
htons是h、to、n、s等字母的组合,意思是把把本机字节序转换成网络字节序的无符号16位整数。
ntohl是n、to、h、l等字母的组合,意思是把把网络字节序转换成本机字节序的无符号32位整数。
下边提供一个代码段示例endian_exchange.c:
#include<stdio.h>
#include<arpa/inet.h>
int main(int argc,char **argv[])
{unsigned short hostPort = 0x2345;unsigned short networkPort;unsigned long hostAddress = 0x23456789;unsigned long networkAddress;networkPort=htons(hostPort);networkAddress=htonl(hostAddress);printf("Host order port:%#x \n",hostPort);printf("Network order port:%#x \n",networkPort);printf("Host order address:%#lx \n",hostAddress);printf("Network order address:%#lx \n",networkAddress);return 0;
}
gcc endian_exchange.c -o endian_exchange进行编译,./endian_exchange执行。

此文章为11月Day 30学习笔记,内容来源于极客时间《网络编程实战》。