学习目的是使用,网络编程中主机字节顺序与网络字节顺序转换这块就用到了这些概念及其函数!
文章目录:
大端存储与小端存储
1.1 低地址与高地址
1.2 数据的高位与低位
1.3 大端存储
1.3.1 定义
1.3.2 小端存储举例小端存储
2.1. 定义
2.2 小端存储举例Linux网络通信
3.1 四个函数存在的意义
3.2. htonl())函数
3.3. htons()函数
3.4. ntohs()函数
3.5. ntohl()函数
大端存储与小端存储
大端:将数据的低位字节放到高地址空间,高位字节放到低地址空间。地址由小向大增加,而数据从高位往低位放;
小端:将数据的低位字节放到低地址处,高位字节放到高地址处。高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致;
低地址与高地址
高地址:值较大的地址
低地址:值较小的地址
注意:计算机读数据永远是从低地址开始的!!!
数据的高位与低位
数据的高位:数据左边位置的数
数据的低位:数据右边位置的数
数据的高位和低位又称高字节和低字节
大端存储
1. 定义
将数据的低位字节放到高地址空间,高位字节放到低地址空间。地址由小向大增加,而数据从高位往低位放;
2.小端存储举例
存放二进制数:1011-0100-1111-0110-1000-1100-0001-0101
- 存放的时是以一个存储单元为单位来存放
- 读取从低地址读起!我们知道这是小端存储,所以在读出来的时候会从高位开始放
小端存储
1. 定义
将数据的低位字节放到低地址处,高位字节放到高地址处。高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致;
2.小端存储举例
- 存放的时是以一个存储单元为单位来存放
- 读取从低地址读起!我们知道这是小端存储,所以在读出来的时候会从低位开始放
存放二进制数:1011-0100-1111-0110-1000-1100-0001-0101
Linux网络通信
参考链接:https://blog.csdn.net/m0_73825482/article/details/134315400
四个函数存在意义
为什么存在这个函数呢?或者存在这个函数的意义?(大端小端存储)
先引入字节存放的两个概念一个是“大端顺序”,一个是“小端顺序”。俗称“小尾顺序”、“大尾顺序”。
简单的说就是对应数据的高字节存放在低地址,低字节存放在高地址上就是大端顺序;
对应数据的高字节存放在高地址,低字节存放在低地址上就是小端顺序。
比如 unsigned long hostlong = 0xa2b4c6d8;
大端顺序存放:
偏移地址 存放内容
0x00000000 0xa2
0x00000001 0xb4
0x00000002 0xc6
0x00000003 0xd8
小端顺序存放:
偏移地址 存放内容
0x00000000 0xd8
0x00000001 0xc6
0x00000002 0xb4
0x00000003 0xa2
同理推理16位数以及64位数。
一般地,在我的编译器里面设置的是小端顺序,这个可以根据自己的编译器看下设置,这里不深入说明。
但是网络传输数据采用的是大端顺序。
所以这才涉及到主机字节顺序和网络字节顺序,再说的详细一点,主机字节顺序可能是大端顺序或者小端顺序(这个要看编译器的设置,还有自己是用的C还是Java还是其他的语言,其各自都是不尽相同),但是网络字节顺序一定是大端顺序。
1. htonl()函数
原型:
uint32_t htonl(uint32_t hostlong)
参数:
hostlong:主机字节顺序表达的32位数
htonl中的h–host主机地址,to–to,n–net网络,l–unsigned long无符号的长整型(32位的系统是4字节);
返回值:
一个32位的网络字节顺序;
作用:
将一个32位数从主机字节顺序转换成网络字节顺序。
2. htons()函数
原型:
uint16_t htons(uint16_t hostlong)
参数:
hostlong是主机字节顺序表达的16位数
htons中的h–host主机地址,to–to,n–net网络,s–unsigned short无符号的短整型(32位的系统是2字节);
返回值:
一个16位的网络字节顺序;
作用:
将一个16位数从主机字节顺序转换成网络字节顺序,简单的说就是把一个16位数高低位呼唤。
3. ntohs()函数
原型:
uint16_t ntohs(uint16_t netshort)
参数:
netshort是网络字节顺序表达的16位数
ntohs中的n–net网络,to–toh–host主机地址,s–unsigned short无符号的短整型(32位的系统是2字节);
返回值:
一个16位的主机字节顺序;
作用:
将一个16位数由网络字节顺序转换为主机字节顺序,简单的说就是把一个16位数高低位互换。
4. ntohl()函数
原型:
uint32_t ntohs(uint32_t netlong)
参数:
netlong是网络字节顺序表达的32位数
ntohs中的n–net网络,to–toh–host主机地址,l–unsigned long无符号的长整型(32位的系统是4字节);
返回值:
一个32位的主机字节顺序;
作用:
将一个32位数由网络字节顺序转换为主机字节顺序。