`
axengine
  • 浏览: 147359 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

【转】字节序,大小端

阅读更多

字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。

其实大部分人在实际的开发中都很少会直接和字节序打交道。唯有在跨平台以及网络程序中字节序才是一个应该被考虑的问题。

在所有的介绍字节序的文章中都会提到字节序分为两类:Big-Endian和Little-Endian。引用标准的Big-Endian和Little-Endian的定义如下:
a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
c) 网络字节序:4个字节的32 bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。这种传输次序称作大端字节序。由于 TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。比如,以太网头部中2字节的“以太网帧类型”,表示后面数据的类型。对于ARP请求或应答的以太网帧类型来说,在网络传输时,发送的顺序是0x08,0x06。
栈底 (高地址)
---------------
0x06 -- 低位 
0x08 -- 高位
---------------
栈顶 (低地址)
该字段的值为0x0806。按照大端方式存放在内存中。

 

------------------------

|高地址:命令行参数和环境变量

----------------------- 0xC0000000 X86处理器
 | 栈底
 |
 |             栈
 |
 |
 |
\|/

NULL (空洞)

/|\
 |
 |
 |              堆

-----------------------
 未初始化的数据:由EXEC初始化为0或空指针 BSS
----------------(统称数据段)
初始化的数据
-----------------------  :由EXEC从程序读入
正文段(代码段)
----------------------- 正文段开始:0x08048000 X86处理器

 

 

现在我们弄清了高低地址,接着来弄清高/低字节,如果我们有一个32位无符号整型0x12345678(呵呵,恰好是把上面的那4个字节buf看成一个整型),那么高位是什么,低位又是什么呢?其实很简单。在十进制中我们都说靠左边的是高位,靠右边的是低位,在其他进制也是如此。就拿 0x12345678来说,从高位到低位的字节依次是0x12、0x34、0x56和0x78。

高低地址和高低字节都弄清了。我们再来回顾一下Big-Endian和Little-Endian的定义:
以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value:
Big-Endian: 低地址存放高位
栈底 (高地址)
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
栈顶 (低地址)

Little-Endian: 低地址存放低位
栈底 (高地址)
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
---------------
栈顶 (低地址)

在现有的平台上Intel的X86采用的是Little-Endian,而像Sun的SPARC采用的就是Big-Endian。

三、例子

嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。

例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址  存放内容
 0x4001    0x12
 0x4000    0x34

而在Big-endian模式CPU内存中的存放方式则为:

内存地址  存放内容
 0x4001    0x34
 0x4000    0x12
 
32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址  存放内容
 0x4003     0x12
 0x4002     0x34
 0x4001     0x56
 0x4000     0x78
 
而在Big-endian模式CPU内存中的存放方式则为:

内存地址  存放内容
 0x4003     0x78
 0x4002     0x56
 0x4001     0x34
 0x4000     0x12

分享到:
评论

相关推荐

    浅学字节序——字节序大小端,主机字节序,网络字节序的理解

    ### 检测主机大小端类型 在C语言中,可以通过编写简单的代码来检测当前系统的字节序类型。下面是一个示例代码: ```c #include int main() { unsigned int test = 0x12345678; char *ptr = (char *)&test; ...

    大小端字节序介绍几转换

    ### 大小端字节序概念与转换 #### 一、引言 在计算机系统中,数据的存储和传输方式至关重要。特别是在网络通信领域,不同的系统可能会采用不同的字节序来存储多字节数据,这可能导致数据解释上的不一致。因此,理解...

    判断主机字节序大小端

    判断主机到底是大端还是小端的c程序!利用位置判断

    字节序转换辅助类,字节大端小端转换

    字节序转换辅助类,short大小端转换,ushort大小端转换,int大小端转换,uint大小端转换,long大小端转换,ulong大小端转换; short类型 小端转大端,short类型 大端转小端,int类型 小端转大端,int类型 大端转小端...

    TIA博途-32位浮点数大小端存储-高低字节转换的具体方法示例(4种字节排列顺序).docx

    在计算机科学中,32位浮点数...总之,理解和掌握浮点数的大小端存储以及高低字节转换在TIA博途中是至关重要的,特别是在进行跨平台或网络通信的程序设计时。通过这个FB块的示例,我们可以更直观地学习并应用这些概念。

    网络字节序和主机字节序

    常见的有两种字节序:Little Endian(小端字节序)和 Big Endian(大端字节序)。Little Endian 将低序字节存储在起始地址,而 Big Endian 将高序字节存储在起始地址。 Little Endian 最符合人的思维的字节序,因为...

    大小端转换(C++)

    提供一个大小端转换的类,可以转换short int float double类型,提供一个大小端转换的类,可以转换short int float double类型,提供一个大小端转换的类,可以转换short int float double类型

    二进制文件大小端转换工具,

    标题中的“二进制文件大小端转换工具”指的是一个独立的应用程序,其主要功能是帮助用户将二进制文件中的数据按照目标平台的字节序进行转换。这样的工具通常用于解决不同处理器架构之间的兼容性问题,例如在ARM架构...

    TIA博途-32位浮点数大小端存储-高低字节转换全局FB库文件(4种字节排列顺序)-V17版本.zip

    在IT行业中,尤其是在嵌入式系统、网络通信和数据存储等领域,理解32位浮点数的大小端存储以及高低字节转换是非常重要的基础知识。TIA博途( Totally Integrated Automation Portal)是西门子推出的一款集成自动化...

    Float类型大小端转换测试程序

    本文将深入探讨浮点数在不同字节序之间的转换,主要基于提供的“Float类型大小端转换测试程序”。 标题中的“Float类型大小端转换测试程序”是一个用于验证和实现浮点数在大端和小端系统之间转换的代码。浮点数由多...

    stm32 crc32校验程序 支持32位int整型字节对齐 大小端

    大小端问题是指在不同的处理器架构中,多字节数据类型(如32位整数)在内存中的存储顺序不同。小端(Little-Endian)系统将最低有效字节存储在最低地址,而大端(Big-Endian)系统则相反,将最高有效字节放在最低...

    各种系统上遇到的大小端字节序问题解释

    对大端字节序和小端字节序操作系统中,对十六进制数据读取顺序通过文字和图示进行了说明。

    高低字节转换示例Demo

    在IT领域,高低字节转换是一项基础且重要的...通过理解和应用这个示例,开发者可以更好地理解字节序的概念,同时掌握在MFC环境下进行文件操作和数据转换的方法。这对于跨平台编程和网络通信中的数据交换具有重要意义。

    C语言字节序比特序

    在C语言中,字节序与比特序是基础概念,它们描述了计算机内存中数据的存储方式和位的排列顺序。理解这些概念对于处理二进制数据、进行底层编程或开发跨平台应用至关重要。 1. 大小端的概念 大小端模式(Endianness...

    网络字节序_werevj4_源码.rar

    如果结构体包含多个不同大小的成员,且在不同字节序的系统间传输,不进行适当的字节序处理可能导致数据解析错误。因此,对于跨平台的网络应用,了解和正确处理字节序至关重要。 这个压缩包中的源码可能通过实例展示...

    S7-200SMART任意连续字节数据高低字节调换库文件及使用说明.zip

    该压缩包包含了一个库文件,用于实现S7-200SMART PLC中任意连续字节数据的倒序,即实现大小端转换。这个库文件特别适用于处理多个连续字节的数据,例如读取或写入的数字、浮点数等。使用这个库可以极大地简化程序...

    大端序和小端序

    这种顺序对于跨平台和网络程序非常重要,因为不同的平台和网络协议可能使用不同的字节序。 字节序可以分为两类:Big-Endian 和 Little-Endian。Big-Endian 是高位字节排放在内存的低地址端,低位字节排放在内存的高...

    C语言--大小端序

    ### C语言中的大小端序 在计算机科学领域中,数据的存储格式对于理解硬件与软件交互至关重要。在C语言编程中,数据存储的一种关键概念便是“大小端序”,这一概念直接关系到数据如何在内存中排列。本文将深入探讨...

    C/C++ 大小端判断

    在计算机科学中,"大小端"(Endianness)是指数据在内存或网络传输中存储的顺序。简单来说,就是指多字节数据(如整数或浮点数)是按照高字节优先(Big-Endian)还是低字节优先(Little-Endian)的方式存储的。这个...

Global site tag (gtag.js) - Google Analytics