网络字节序与主机字节序的转换函数实践
1、什么是字节序?
字节序,顾名思义,就是字节组织的顺序
分为两种,一种是以IBM、Oracle公司为代表的大端序(big endian),一种是以Intel公司为首的小端序(little endian)
举个例子,0x1234567,这个是一个十六进制的整数,储存它需要至少四个字节。
如果从0x100开始储存0x1234567这个数,存储结构如下图
地址 | 0x100 (低地址) | 0x101 | 0x102 | 0x103(高地址) |
---|---|---|---|---|
小端序 | 67 | 45 | 23 | 01 |
大端序 | 01 | 23 | 45 | 67 |
大端字节序(Big Endian)
高位字节数据存放在内存低地址处,低位字节数据存放在内存高地址处。
小端字节序(Little Endian)
高位字节数据存放在内存高地址处,低位数据存放在内存低地址处。
2、为什么需要字节序呢?
很多人会问,为什么会有字节序,统一用大端序不行吗?答案是,计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。在计算机内部,小端序被广泛应用于现代 CPU 内部存储数据;而在其他场景,比如网络传输和文件存储则使用大端序。
两种字节序优缺点
小端优点:
符合人的思维的字节序地址低位存储值的低位地址高位存储值的高位。从人的第一观感来说低位值小,就应该放在内存地址小的地方,也即内存地址低位;反之,高位值就应该放在内存地址大的地方,也即内存地址高位。
大端优点:
直观的字节序地址,不要考虑对应关系只需要把内存地址从左到右按照由低到高的顺序写出,把值按照通常的高位到低位的顺序写出两者对照,一个字节一个字节的填充进去。
3、网络字节序与主机字节序的转换
tcp/ip规定它们的网络字节序都是大端字节序。主机字节序可能是大端也可能是小端,与主机的cpu有关,与操作系统无关
由于主机字节序的不同,数据从主机 A 到主机 B 的过程中,需要有一个标准化的过程,就是主机字节序和网络字节序互相转换
网络序转主机序
函数 | 含义 | 作用 |
---|---|---|
ntohs() | network to host short | 把unsigned short类型从网络序转换到主机序 |
ntohl() | network to host long | 把unsigned long类型从网络序转换到主机序 |
主机序转网络序
函数 | 含义 | 作用 |
---|---|---|
htons() | host to network short | 把unsigned short类型从主机序转换到网络序 |
htonl() | host to network long | 把unsigned long类型从主机序转换到网络序 |
参考文章
字节序的概念-CSDN
什么是字节序?-CSDN
主机字节序和网络字节序-CSDN
C++ 插入运算符cout-CSDN