网络字节序(大端字节序)的定义:规定使用大端字节序(网络字节序)作为标准:接收端接收到的第一个字节是发送端的高位字节,存放到低位地址。
网络传输中要多字节数据要进行主机/网络字节序转换的原因
网络字节序中,发送端发送的第一个字节是高位字节(取自内存的低地址),接收端收到后存入低位地址,由于主机的CPU架构不同,导致不同主机的字节序有所不同,因此对于多字节数据,在网络传输中需要进行主机/网络字节序的转换,接收端/发送端 才能正确的解析出多字节数据。
主机字节序
主机字节序(又称为CPU字节序)是由CPU指令集架构决定的,和操作系统无关。主机字节序分为两种:大端字节序(Big Endian)和小端字节序(Little Endian)
对于4字节数据 0x12345678 在不同架构的主机中存储的方式不同(注意:计算机中存储的只有二进制数据,为了可读性,编程语言才会对数据进行格式化输出)
大端字节序
大端字节序的主机:计算机将按照从左往右的字节顺序将数据存储在内存中,低位字节存储在高位地址,高位字节存储在低位地址。
小端字节序
小端字节序的主机:计算机将按照从左往右的字节顺序将数据存储在内存中,低位字节存储在低位地址,高位字节存储在高位地址。
网络字节序
由于不同的主机架构,字节序有所不同,网络通信中,规定使用大端字节序(网络字节序)作为标准:接收端接收到的第一个字节是发送端的高位字节,存放到低位地址。因此需要发送端/接收端进行主机字节序和网络字节序的转换,以确保数据的正确传输和解析
发送端:
发送的第一个字节是高位字节(取自内存中的低位地址),因此多字节数据在进行网络数据传输时,需要将主机字节序转为网络字节序。
接收端:
接收的第一个字节(高位字节)存放在低位地址。因此,需要将网络字节序转为主机字节序。
错误: 发送端/接收端未进行主机/网络字节序转换
发送端(小端)在发送4字节数据( 0x12345678)之前, 没有进行主机字节序到网络字节序的转换,导致接收端(大端)收到的数据为( 0x78563412)
接收端(小端)没有将4字节数据 (0x12345678) 进行网络字节序到主机字节序的转换,导致接收收到的数据为 (0x78563412)
正确: 发送端/接收端进行主机/网络字节序转换
发送端(小端)在发送数据之前将4字节数据(0x12345678)进行主机字节序到网络字节序的转换,因此接收端(大端)收到的数据为(0x12345678)
发送端(大端)发送4字节数据(0x12345678)接收端(小端)将数据进行网络字节序到主机字节序的转换,得到的数据是 (0x12345678)
【Linux】C/C++ 主机/网络字节序转换函数
阅读到这里,是不是已经掌握了,主机字节序和网络字节序的知识,尤其是在网络传输中的字节序转换。附上主机、网络字节序的转化函数,如下:
htonl()、htons() /* 主机字节序转化为网络字节序 */
ntohl()、ntohs() /* 网络字节序转化为主机字节序 */
总结
所有文章中给出的代码和示例,都是通过测试验证后贡献给大家的,文章中有些地方可能会出现笔误,欢迎童鞋们及时指出并加以更正。
关注小编,每篇文章都有不一样的体验和感悟,可以留言或者私信小编沟通交流,一起学习呦。
创作不易,动动发财的小手点个免费的关注再走呗!