`
duyouhua1214
  • 浏览: 228198 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

解析大端模式和小端模式

 
阅读更多

作者:王正伟,华清远见嵌入式学院讲师。

一、概念及详解

在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式。

先回顾两个关键词,MSB和LSB:

MSB:Most Significant Bit ------- 最高有效位
        LSB:Least Significant Bit ------- 最低有效位

大端模式(big-edian)

big-endian:MSB存放在最低端的地址上。

举例,双字节数0x1234以big-endian的方式存在起始地址0x00002000中:

| data |<-- address
        | 0x12 |<-- 0x00002000
        | 0x34 |<-- 0x00002001

在Big-Endian中,对于bit序列中的序号编排方式如下(以双字节数0x8B8A为例):

bit | 0 1 2 3 4 5 6 7 | 8 9 10 11 12 13 14 15
        ------MSB----------------------------------LSB
        val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
        +--------------------------------------------+
        = 0x8 B 8 A

小端模式(little-endian)

little-endian:LSB存放在最低端的地址上。

举例,双字节数0x1234以little-endian的方式存在起始地址0x00002000中:

| data |<-- address
        | 0x34 |<-- 0x00002000
        | 0x12 |<-- 0x00002001

在Little-Endian中,对于bit序列中的序号编排和Big-Endian刚好相反,其方式如下(以双字节数0x8B8A为例):

bit | 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0
        ------MSB-----------------------------------LSB
        val | 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
        +---------------------------------------------+
        = 0x8 B 8 A

二、数组在大端小端情况下的存储:

以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) -- 低位
        --------------
        低地址

三、大端小端转换方法:

Big-Endian转换成Little-Endian如下:

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

四、大端小端检测方法:

如何检查处理器是big-endian还是little-endian?

联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性就可以轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。

int checkCPUendian()
        {
                union
                {
                        unsigned int a;
                        unsigned char b;
                }c;
                c.a = 1;
                return (c.b == 1);
        }
        /*return 1 : little-endian, return 0:big-endian*/

分享到:
评论

相关推荐

    嵌入式系统/ARM技术中的解析大端模式和小端模式

     在各种体系的计算机中通常采用的字节存储机制主要有两种: big-endian和little-endian,即大端模式和小端模式。  先回顾两个关键词,MSB和LSB:  MSB:Most Significant Bit ------- 最高有效位 LSB:Least ...

    大小端判断代码解析详解

    大端模式:高位字节存在低位地址上 小端模式:高位字节存在高位地址上

    C/C++数据对齐详细解析

    大端和小端的问题有必要在这里介绍一下,计算机里面每个地址单元对应着一个字节,一个字节为8bit,对于位数大于8位的处理器来说,寄存器的宽度是大于一个字节的,例如16bit的short型变量x,在内存中的地址是0x0010,...

    节序问题:解析大小的端判定

    一、大小端概念要判断电脑的大小端,肯定先要理解大小端的概念:大端模式(Big-Endian),是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中,即高低高低;小端模式(Little-Endian),是...

    ImHex软件.zip

    数组、指针、结构、联合、枚举、位域、命名空间、小端和大端支持、条件等等! 有用的错误信息、语法高亮和错误标记 数据导入 Base64 文件 IPS 和 IPS32 补丁 数据导出 IPS 和 IPS32 补丁 数据检查器允许将数据解释为...

    Dex格式简析与增量更新1

    内存地址0x1000(低地址)0x1003(高地址)大端模式0x12(高字节)0x78(低字节)小端模式0x78(低字节)0x12(高字节)Dex格式解析与增量

    ImHex16進制編輯器.7z

    數組、指針、結構、聯合、枚舉、位域、使用聲明、小端和大端支持、條件等等! 有用的錯誤消息、語法高亮和錯誤標記 數據導入 Base64 文件 IPS 和 IPS32 補丁 數據導出 IPS 和 IPS32 補丁 數據檢查器允許將數據解釋為...

    imhex-功能强大的十六进制编辑器,开源软件

    数据检查器允许解释多种不同类型的数据(小端和大端)。大文件支持和快速有效的加载。文件哈希支持:CRC16、CRC32、MD4、MD5、SHA-1、SHA-224、SHA-256、SHA-384和SHA-512。反汇编程序支持多种不同的体系结构:ARM32...

    ImHex:一款功能强大的十六进制编辑器

    数据检查器允许解释多种不同类型的数据(小端和大端)。 大文件支持和快速有效的加载。 文件哈希支持:CRC16、CRC32、MD4、MD5、SHA-1、SHA-224、SHA-256、SHA-384和SHA-512。 反汇编程序支持多种不同的体系结构...

    linux网络编程-宋敬彬-part1

    8.1.1 大端字节序和小端字节序 210 8.1.2 字节序转换函数 212 8.1.3 一个字节序转换的例子 214 8.2 字符串IP地址和二进制IP地址的转换 217 8.2.1 inet_xxx()函数 217 8.2.2 inet_pton()和inet_ntop()函数 ...

    C++ Qt modbus RTU 485读写线圈、整数、浮点数

    C++ Qt modbus RTU 485读写线圈、整数、浮点数

    TargetShooting-ResultCsvParser

    #TargetShooting CSV 解析器##Usage -help命令为您提供了如何使用解析器的提示。 ##CSV 文件结构文件中的每条记录都必须遵循此约定。 Date;Description;Result;Category;TypeOfProgramme每个记录文件必须包含一个...

    HEX Data Split.zip

    在不同的mcu通讯下,一般采用16进制通讯。本vi是为了快速方便地解析通讯协议,在项目开发中能极大地减少开发时间

    linux网路编程 中文 23M 版

    1.1.1 Linux的诞生和发展.............................................. 2 1.1.2 Linux名称的由来........................................ ........ 3 1.2 Linux的发展要素.......................................

Global site tag (gtag.js) - Google Analytics