天天看點

深入淺出: 大小端模式一、什麼大小端?二、為什麼有大小端模式之分呢?三、java中的大小端

大小端在計算機業界,endian表示資料在存儲器中的存放順序。百度百科如下叙述之:

大端模式,是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中,這樣的存儲模式有點兒類似于把資料當作字元串順序處理:位址由小向大增加,而資料從高位往低位放; 小端模式,是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中,這種存儲模式将位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低,和我們的邏輯方法一緻。

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

比如整形十進制數字:305419896 ,轉化為十六進制表示 : 0x12345678 。其中按着十六進制的話,每兩位占8個位,及一個位元組。如圖

深入淺出: 大小端模式一、什麼大小端?二、為什麼有大小端模式之分呢?三、java中的大小端
如果統一使用大端或者小端,那麼何來三國演義,何來一戰二戰呢?還有大小端也來源于戰争。是以存在即是合理。

在作業系統中,x86和一般的os(如windows,freebsd,linux)使用的是小端模式。但比如mac os是大端模式。

在計算機系統中,我們是以位元組為機關的,每個位址單元都對應着一個位元組,一個位元組為8bit。但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器)。另外,對于位數大于8位的處理器,例如16位或者32位的處理器,由于寄存器寬度大于一個位元組,那麼必然存在着一個如果将多個位元組安排的問題。是以就導緻了大端存儲模式和小端存儲模式。

知道為什麼有模式的存在,下面需要了解下具有有什麼應用場景:

1、不同端模式的處理器進行資料傳遞時必須要考慮端模式的不同

2、在網絡上傳輸資料時,由于資料傳輸的兩端對應不同的硬體平台,采用的存儲位元組順序可能不一緻。是以在tcp/ip協定規定了在網絡上必須采用網絡位元組順序,也就是大端模式。對于char型資料隻占一個位元組,無所謂大端和小端。而對于非char類型資料,必須在資料發送到網絡上之前将其轉換成大端模式。接收網絡資料時按符合接受主機的環境接收。

存儲量大于1位元組,非char類型,如int,float等,要考慮位元組的順序問題了。java由于虛拟機的關系,屏蔽了大小端問題,需要知道的話可用 byteorder.nativeorder() 查詢。在操作bytebuffer中,也可以使用 bytebuffer.order() 進行設定:

<a href="http://www.bysocket.com/?p=615#">?</a>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

<code>/**</code>

<code> </code><code>* @author jeff lee</code>

<code> </code><code>* @since 2015-10-13 20:40:00</code>

<code> </code><code>* bytebuffer中位元組存儲次序</code>

<code> </code><code>*/</code>

<code>public</code> <code>class</code> <code>endians {</code>

<code>    </code><code>public</code> <code>static</code> <code>void</code> <code>main(string[] args) {</code>

<code>        </code><code>// 建立12個位元組的位元組緩沖區</code>

<code>        </code><code>bytebuffer bb = bytebuffer.wrap(</code><code>new</code> <code>byte</code><code>[</code><code>12</code><code>]);</code>

<code>        </code><code>// 存入字元串</code>

<code>        </code><code>bb.ascharbuffer().put(</code><code>"abdcef"</code><code>);</code>

<code>        </code><code>system.out.println(arrays.tostring(bb.array()));</code>

<code>        </code><code>// 反轉緩沖區</code>

<code>        </code><code>bb.rewind();</code>

<code>        </code><code>// 設定位元組存儲次序</code>

<code>        </code><code>bb.order(byteorder.big_endian);</code>

<code>        </code><code>bb.ascharbuffer().put(</code><code>"abcdef"</code><code>);</code>

<code>        </code><code>bb.order(byteorder.little_endian);</code>

<code>    </code><code>}</code>

<code>}</code>

run下結果如圖所示:

深入淺出: 大小端模式一、什麼大小端?二、為什麼有大小端模式之分呢?三、java中的大小端

前兩句列印說明了,bytebuffer存儲位元組次序預設為大端模式。最後一段設定了位元組存儲次序,然後會輸出,可以看出存儲次序為小端模式。