字节序(大小端、网络字节序)

背景

之前的工作中涉及到大小端,只是知道了大小端的具体格式以及转换方式,没有深究。这次在当前的项目中涉及到了不同主机上的raw data的解析,牵扯到了大小端和网络字节序,所以找了一些资料,加上自己的理解,写了这篇文章,可能有误,如有请留言或私信,谢谢

什么是字节序

字节序是数据的存储方式或者说是顺序,有大端和小端两种格式本机的字节序只与CPU有关,与操作系统等无关
为什么会有字节序的概念?
不同的CPU保存数据的格式不同
以0x12345678(假设在内存中存储的起始地址是0x4000)为例:

数据0x780x560x340x12
大端0x40030x40020x40010x4000
小端0x40000x40010x40020x4003

从上面可以看出,小端格式与人的通常理解一致:低位(0x78)数据存放在内存中的低地址(0x4000),高位数据存放在内存中的高地址;大端格式正好相反;

注意:
1、
之前我理解字节序时,感觉字节序只与多字节的数据类型有关,比如说short或者int有关,而与char这种单字节的数据类型无关,或者说字节序是以字节为单位的——这个理解是错误的,字节序其实涉及到的是数据的前后排列,只要有多类型——不一定是字节,可以是以位位单位,比如说:

typedef struct Test {
char t1:2;
char t2:2;
char t3:2;
char t4:2;
};

那么t1 t2 t3 t4也会涉及字节序问题,不过这个是在本地的,不涉及到后面所说的网络字节序
2、
只要是x86(包括32和x64)上面的,数据格式都是小端;

字节序设计的初衷可以参考:
理解字节序
答案是,计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。
但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。

更进一步:
How to teach endian

什么是网络字节序

网络字节序是指数据在网络传输时的存放顺序
与操作系统和CPU类型都无关——这是最重要的一点!
网络字节序是大端模式
为什么会有网络字节序?
根本原因是上面所提到的:
不同CPU架构上的存储格式不同,存在大小端的差异

那么问题来了,从A发送数据到B和C,如果B和C分别是大端和小端格式,那么A应该怎么处理?由于A是不知道B或者C的具体数据格式的(就算知道,假设后面扩展,也不可能针对每一个目的端进行相应的设置),怎么处理呢?
统一处理:发送端在发送前,根据本地(A)的数据格式和网络字节序是否一致,做一定的处理,保证自己发送出去的数据格式(网络字节序),那么接收端无论自己是大端还是小端,那么确定了接收到的数据是网络字节序后,根据本地格式与网络字节的同异,进行相应的处理后即可解析数据;

从上面可以看出,网络字节序的设计初衷是为了统一,是为了适配不同的CPU架构到同一个系统(千变万化的网络)才作出的一种统一的约定;

可参考:
大端、小端、与网络字节序 和 Tcp/IP 协议

疑问:
字节序到底与系统有关不?
TCP/IP——大端、小端字节序,网络字节序

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lqw198421

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值