Writer :BYSocket(泥沙磚瓦漿木匠)
一、什么大小端?
大小端在計算機業界,Endian表示數據在存儲器中的存放順序。百度百科如下敘述之:
大端模式,是指數據的高字節保存在內存的低地址中,而數據的低字節保存在內存的高地址中,這樣的存儲模式有點兒類似於把數據當作字符串順序處理:地址由小向大增加,而數據從高位往低位放;
小端模式,是指數據的高字節保存在內存的高地址中,而數據的低字節保存在內存的低地址中,這種存儲模式將地址的高低和數據位權有效地結合起來,高地址部分權值高,低地址部分權值低,和我們的邏輯方法一致。
這兩種模式,泥瓦匠記憶宮殿:“小端低低”。這樣就知道小端的模式,反之大端的模式。
比如整形十進制數字:305419896 ,轉化為十六進制表示 : 0x12345678 。其中按着十六進制的話,每兩位占8個字節。如圖
二、為什么有大小端模式之分呢?
如果統一使用大端或者小端,那么何來三國演義,何來一戰二戰呢?還有大小端也來源於戰爭。所以存在即是合理。
在操作系統中,x86和一般的OS(如windows,FreeBSD,Linux)使用的是小端模式。但比如Mac OS是大端模式。
在計算機系統中,我們是以字節為單位的,每個地址單元都對應着一個字節,一個字節為8bit。但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器)。另外,對於位數大於8位的處理器,例如16位或者32位的處理器,由於寄存器寬度大於一個字節,那么必然存在着一個如果將多個字節安排的問題。因此就導致了大端存儲模式和小端存儲模式。
知道為什么有模式的存在,下面需要了解下具有有什么應用場景:
1、不同端模式的處理器進行數據傳遞時必須要考慮端模式的不同
2、在網絡上傳輸數據時,由於數據傳輸的兩端對應不同的硬件平台,采用的存儲字節順序可能不一致。所以在TCP/IP協議規定了在網絡上必須采用網絡字節順序,也就是大端模式。對於char型數據只占一個字節,無所謂大端和小端。而對於非char類型數據,必須在數據發送到網絡上之前將其轉換成大端模式。接收網絡數據時按符合接受主機的環境接收。
三、java中的大小端
存儲量大於1字節,非char類型,如int,float等,要考慮字節的順序問題了。java由於虛擬機的關系,屏蔽了大小端問題,需要知道的話可用 ByteOrder.nativeOrder() 查詢。在操作ByteBuffer中,也可以使用 ByteBuffer.order() 進行設置:
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
|
/**
* @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下結果如圖所示:
前兩句打印說明了,ByteBuffer存儲字節次序默認為大端模式。最后一段設置了字節存儲次序,然后會輸出,可以看出存儲次序為小端模式。
歡迎點擊我的博客及GitHub — 博客提供RSS訂閱哦!
———- http://www.bysocket.com/ ————- https://github.com/JeffLi1993 ———-
微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter :BYSocket