详解主机字节序和网络字节序(大小端),以及网络数据传输中如何处理字节序

网络字节序(大端字节序)的定义:规定使用大端字节序(网络字节序)作为标准:接收端接收到的第一个字节是发送端的高位字节,存放到低位地址。

网络传输中要多字节数据要进行主机/网络字节序转换的原因

网络字节序中,发送端发送的第一个字节是高位字节(取自内存的低地址),接收端收到后存入低位地址,由于主机的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() /* 网络字节序转化为主机字节序 */

总结

所有文章中给出的代码和示例,都是通过测试验证后贡献给大家的,文章中有些地方可能会出现笔误,欢迎童鞋们及时指出并加以更正。

关注小编,每篇文章都有不一样的体验和感悟,可以留言或者私信小编沟通交流,一起学习呦。


创作不易,动动发财的小手点个免费的关注再走呗!

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值