首先抛出一个经典问题:为什么在网络编程中需要字节序的转换?比如用htons()来把端口从主机字节顺序转换成网络字节顺序。比如在编写网络底层库的时候,序列化网络数据 和 反序列化网络数据时也要进行字节转换。(序列化网络数据就是发送方组织一连串的数据发送给接收方,在组织过程中要对short 和 int 等多字节类型的变量用htons htonl进行字节序转换,这串数据中有int short 字符串等类型. 反序列化网络数据就是接收方在读取数据时,比如在读取short或者int时,要用ntohs 或者ntohl进行字节序转换)
在回答这个问题之前先介绍下基础部分:
大端和小端:
大端:在低地址存放高字节,在高地址存放低字节
小端:在低地址存放低字节,在高地址存放高字节
注意:地址是左边是低地址,右边是高地址,字节是左边是高字节,右边是低字节。采用大端法存储变量和采用小端法存储变量是根据CPU来决定的。intel的CPU一般采用的是小端法.
比如:short a = 0x1234(两个16进制数字代表一个字节,所以0x12是个字节 0x34是个字节,如果不知道的人你的基础确实太那个什么了)
如果CPU在0x00000000这个地址用大端法存储这个a,则在内存中0x00000000处存储的是0x12 ,在内存0x00000001处存储的是0x34.
如果CPU在0x00000000这个地址用小端法存储这个a,则在内存中0x00000000处存储的是0x34,在内存0x00000001处存储的是0x12
API:htons htonl ntohs ntohl这四个API就是用来进行字节序的转换的,