• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 解析大端模式和小端模式

    解析大端模式和小端模式

    作者: 時間:2012-07-25 來源:網絡 收藏

    一、概念及詳解

    本文引用地址:http://www.czjhyjcfj.com/article/148717.htm

    在各種體系的計算機中通常采用的字節存儲機制主要有兩種: 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*/



    關鍵詞: 模式 大端 解析

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 蕉岭县| 皋兰县| 清新县| 个旧市| 铜鼓县| 墨竹工卡县| 吴堡县| 淮阳县| 景东| 多伦县| 蛟河市| 克山县| 慈溪市| 承德市| 凤山市| 拉萨市| 溧阳市| 卢龙县| 济南市| 中阳县| 潍坊市| 博客| 临猗县| 利川市| 炉霍县| 玉田县| 新河县| 霍邱县| 衢州市| 磐石市| 宁城县| 江门市| 江城| 休宁县| 玉田县| 临邑县| 梁山县| 鲁甸县| 莱芜市| 凤山市| 丰顺县|