网络字节序和主机字节序的转换函数实践

1、什么是字节序


计算机在储存数据时有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)

1.大端字节序(big endian)

大端字节序(big endian)是将值的高位存储在较小的地址,值的低位存储在较大的地址

2.小端字节序(little endian)

小端字节序(little endian)是将值的低位存储在较小的地址,值的高位存储在较大的地址

image
image

2、网络字节序和主机字节序


顾名思义,网络字节序是数据在网上交换时的信息存储方式,而主机字节序是数据在本地进行存储的方式

1.网络字节序

数据在网上传输,如果存储方式不同,那么大家交流数据会比较麻烦,所以TCP/IP协议规定,网上传输采用大端字节序(big endian)统一数据传输规范

2.主机字节序

存储在本地计算机上的数据存储方式是由CPU决定的,不同的CPU会有不同的存储方式,比如x86系列CPU都是little-endian的字节序,

3、计算机处理字节序的方法


计算机在处理数据时不知道大端小端,只会按照自己顺序读取,所以,如果是大端字节序,那么顺序读取第一个就是高位字节,如果是小端字节序,顺序读取第一位就是低位字节

4、网络字节序和主机字节序的转换


两台计算机之间传输数据需要通过网络字节序传输,那么从A计算机到B计算机之间,需要有一个标准化的过程,

1.网络字节序转主机字节序

uint32_t ntohl(uint32_t netlong); //将一个无符号长整型数从网络字节序转换成主机字节序
uint16_t ntohs(uint16_t netshort); //将一个无符号短整型数从网络字节序转换成主机字节序

2.主机字节序转网络字节序

uint32_t htonl(uint32_t hostlong); //将一个无符号长整型数从主机字节序转换成网络字节序
uint16_t htons(uint16_t hostshort); //将一个无符号短整型数从主机字节序转换成网络字节序
- n代表“network”---网络,h代表“host”---主机,l代表long的长度(32位),s代表short的长度(16位)
- 在使用小端字节序的系统中,也就是主机字节序和网络字节序不同,所以这些函数会把字节序进行转换
- 在使用大端字节序的系统中,也就是主机字节序和网络字节序相同,不需要转换,这些函数会定义成空宏

参考文章

网络字节序和主机字节序

网络字节序和主机字节序详解

posted @   辛普森556  阅读(92)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示