字节序的概念和示例
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学习笔记,内容来源于极客时间《网络编程实战》。