深刻淺出: 大小端模式

Writer      :BYSocket(泥沙磚瓦漿木匠) java

1、什麼大小端?

大小端在計算機業界,Endian表示數據在存儲器中的存放順序。百度百科以下敘述之: ios

大端模式,是指數據的高字節保存在內存的低地址中,而數據的低字節保存在內存的高地址中,這樣的存儲模式有點兒相似於把數據看成字符串順序處理:地址由小向大增長,而數據從高位往低位放; git

小端模式,是指數據的高字節保存在內存的高地址中,而數據的低字節保存在內存的低地址中,這種存儲模式將地址的高低和數據位權有效地結合起來,高地址部分權值高,低地址部分權值低,和咱們的邏輯方法一致。 github

這兩種模式,泥瓦匠記憶宮殿:「小端低低」。這樣就知道小端的模式,反之大端的模式。 windows

好比整形十進制數字:305419896 ,轉化爲十六進制表示 : 0x12345678 。其中按着十六進制的話,每兩位佔8個位,即1個字節。如圖 網絡

iostream

2、爲何有大小端模式之分呢?

若是統一使用大端或者小端,那麼何來三國演義,何來一戰二戰呢?還有大小端也來源於戰爭。因此存在便是合理。 socket

在操做系統中,x86和通常的OS(如windows,FreeBSD,Linux)使用的是小端模式。但好比Mac OS是大端模式。 spa

在計算機系統中,咱們是以字節爲單位的,每一個地址單元都對應着一個字節,一個字節爲8bit。可是在C語言中除了8bit的char以外,還有16bit的short型,32bit的long型(要看具體的編譯器)。另外,對於位數大於8位的處理器,例如16位或者32位的處理器,因爲寄存器寬度大於一個字節,那麼必然存在着一個若是將多個字節安排的問題。所以就致使了大端存儲模式和小端存儲模式。 操作系統

知道爲何有模式的存在,下面須要瞭解下具備有什麼應用場景 code

一、不一樣端模式的處理器進行數據傳遞時必需要考慮端模式的不一樣

二、在網絡上傳輸數據時,因爲數據傳輸的兩端對應不一樣的硬件平臺,採用的存儲字節順序可能不一致。因此在TCP/IP協議規定了在網絡上必須採用網絡字節順序,也就是大端模式。對於char型數據只佔一個字節,無所謂大端和小端。而對於非char類型數據,必須在數據發送到網絡上以前將其轉換成大端模式。接收網絡數據時按符合接受主機的環境接收。

3、java中的大小端

存儲量大於1字節,非char類型,如int,float等,要考慮字節的順序問題了。java因爲虛擬機的關係,屏蔽了大小端問題,須要知道的話可用 ByteOrder.nativeOrder() 查詢。在操做ByteBuffer中,也可使用 ByteBuffer.order() 進行設置:

/**
 * @author Jeff Lee
 * @since 2015-10-13 20:40:00
 * ByteBuffer中字節存儲次序
 */
public class Endians {
    public static void main(String[] args) {
        // 建立12個字節的字節緩衝區
        ByteBuffer bb = ByteBuffer.wrap(new byte[12]);
        // 存入字符串
        bb.asCharBuffer().put("abdcef");
        System.out.println(Arrays.toString(bb.array()));

        // 反轉緩衝區
        bb.rewind();
        // 設置字節存儲次序
        bb.order(ByteOrder.BIG_ENDIAN);
        bb.asCharBuffer().put("abcdef");
        System.out.println(Arrays.toString(bb.array()));

        // 反轉緩衝區
        bb.rewind();
        // 設置字節存儲次序
        bb.order(ByteOrder.LITTLE_ENDIAN);
        bb.asCharBuffer().put("abcdef");
        System.out.println(Arrays.toString(bb.array()));
    }
}

run下結果如圖所示:

image

前兩句打印說明了,ByteBuffer存儲字節次序默認爲大端模式。最後一段設置了字節存儲次序,而後會輸出,能夠看出存儲次序爲小端模式。

歡迎點擊個人博客及GitHub — 博客提供RSS訂閱哦!

———- http://www.bysocket.com/ ————- https://github.com/JeffLi1993 ———-

微         博:BYSocket  豆         瓣:BYSocket  FaceBook:BYSocket  Twitter    :BYSocket

相關文章
相關標籤/搜索