端序问题分析

大小端模式是计算机处理多字节数字时内存存储的顺序,影响通信协议和数据传输。大端模式将高字节存放在低地址,小端模式反之。转换方法包括位移操作。常见于网络数据解析和跨平台通信。Intel的x86系列是小端,PowerPC和某些ARM是大端。判断和转换是解决字节序不一致的关键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通信协议中的数据传输、数组的存储方式、数据的强制转换等这些都会牵涉到大小端问题。

1、为什么会有大小端模式之分呢?

在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。

1个byte的存储不涉及端序,端序是字节之间,而不是bit之间。

且地址不管是对于大小端工作的CPU来说都是一样的从小到大的地址增长。

所以端序是指cpu读写内存时的高低顺序。

但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的int型。另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。

对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。

而大小端只是表示存储数据的两种顺序方式,默认内存的读写方式是从低位到高位,处理数据是低位在地址低位,还是高位在地址低位,分为小端和大端两种模式。

因为最开始制定时,没有统一的标准,因而导致了大端和小端两种模式。

同时,什么时候需要注意大端和小端模式呢?

一般是涉及到按位对数据进行处理、网络数据在不同CPU上传输的时候,考虑解析数据的顺序时候;网络上传输的数据都是以大端的形式存放的,所以拿到网络的数据,需要转换为主机字节序。这也是为了屏蔽不同主机的端序问题。

二、什么是大端和小端?

大小端的差异在于存放数据的顺序不同,跟内存本身没有关系,同一段内存,不同的CPU操作同一个数,导致数据存放顺序不同而已。所以大端写入的数据,如果是小端cpu读出,就需要进行端序swap,才能进行计算。

大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。

小端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。

假如32位宽(uint32_t)的数据0x12345678,从地址0x08004000开始存放:

 

大小端转换:

开篇说了,实际应用中,大小端应用的地方很多通信协议、数据存储等。如果字节序不一致,就需要转换。
只要你理解其中原理(高低顺序),转换的方法很多,下面简单列列两个。

1.对于16位字数据

#define BigtoLittle16(A)   (( ((uint16)(A) & 0xff00) >> 8)    | \
                                       (( (uint16)(A) & 0x00ff) << 8))
2.对于32位字数据

#define BigtoLittle32(A)   ((( (uint32)(A) & 0xff000000) >> 24) | \
                                       (( (uint32)(A) & 0x00ff0000) >> 8)   | \
                                       (( (uint32)(A) & 0x0000ff00) << 8)   | \
                                       (( (uint32)(A) & 0x000000ff) << 24))

大小端主要由CPU 决定,但是如ARM可以选择大小端模式,准确说是由运行环境决定大小端模式。

可以通过向内存写多字节数据,然后按照内存由小到大的数据读取,判断大小端模式。

1)就CPU架构而言

小端模式:STM32 X86 
大端模式:PowerPC IBM Sun
ARM 既可以是小端也可以是大端。

Intel的80x86系列芯片是唯一还在坚持使用小端的芯片,ARM芯片默认采用小端,但可以切换为大端;而MIPS等芯片要么采用全部大端的方式储存,要么提供选项支持大端——可以在大小端之间切换。

以下为参考文章:
————————————————
版权声明:本文为优快云博主「查尔斯是码农」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/weixin_42121713/article/details/105043335

————————————————
版权声明:本文为优快云博主「幽幽起来写代码啦」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/weixin_44890250/article/details/109186636

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值