複製鏈接
請複製以下鏈接發送給好友

Endian

鎖定
在各種計算機體系結構中,對於字節、字等的存儲機制有所不同,因而引發了計算機通信領域中一個很重要的問題,即通信雙方交流的信息單元(比特字節、字、雙字等等)應該以什麼樣的順序進行傳送。如果不達成一致的規則,通信雙方將無法進行正確的編/譯碼從而導致通信失敗。
中文名
Endian
在各種
計算機體系結構
應    該
以什麼樣的順序進行傳送

Endian定義

在各種體系的計算機中,通常採用big-endian和little-endian兩種字節存儲機制描述在多字節數中各個字節的存儲順序。 [1] 

Endian詞源

據Jargon File記載,endian這個詞來源於Jonathan Swift在1726年寫的諷刺小説 "Gulliver's Travels"(《格利佛遊記》)。該小説在描述Gulliver暢遊小人國時碰到了如下的一個場景。在小人國裏的小人因為非常小(身高6英寸)所以總是碰到一些意想不到的問題。有一次因為對水煮蛋該從大的一端(Big-End)剝開還是小的一端(Little-End)剝開的爭論而引發了一場戰爭,並形成了兩支截然對立的隊伍:支持從大的一端剝開的人Swift就稱作Big-Endians,而支持從小的一端剝開的人就稱作Little-Endians......(後綴ian表明的就是支持某種觀點的人)。
1980年,Danny Cohen在其著名的論文"On Holy Wars and a Plea for Peace"中為了平息一場關於在消息中字節該以什麼樣的順序進行傳送的爭論而引用了該詞。該文中,Cohen非常形象貼切地把支持從一個消息序列的最高位開始傳送的那夥人叫做Big-Endians,支持從最低位開始傳送的相對應地叫做Little-Endians。此後Endian這個詞便隨着這篇論文而被廣為採用。

Endian小端和大端格式

小端和大端格式(Little-Endian&Big-Endian)
不同的CPU有不同的字節序類型,這些字節序是指整數在內存中保存的順序。
最常見的有兩種:
1. Little-endian:將低序字節存儲在起始地址(低位編址)
2. Big-endian:將高序字節存儲在起始地址(高位編址)
LE(little-endian):
最符合人的思維的字節序:地址低位存儲值的低位,地址高位存儲值的高位。
怎麼講是最符合人的思維的字節序,是因為從人的第一觀感來説:低位值小,就應該放在內存地址小的地方,也即內存地址低位;反之,高位值就應該放在內存地址大的地方,也即內存地址高位
BE(big-endian):
最直觀的字節序:地址低位存儲值的高位,地址高位存儲值的低位。
為什麼説直觀,不要考慮對應關係:只需要把內存地址從左到右按照由低到高的順序寫出,把值按照通常的高位到低位的順序寫出;兩者對照,一個字節一個字節的填充進去
例子1:在內存中雙字0x01020304(DWORD)的存儲方式。
內存地址4000 4001 4002 4003
LE04030201
BE01020304
注:每個地址存1個字節,每個字有2個字節。2位16進制數是1個字節(0xFF=11111111)。
例子2:如果我們將0x1234abcd寫入到以0x0000開始的內存中,則結果為
內存
big-endian
little-endian
0x0000
0x12
0xcd
0x0001
0x34
0xab
0x0002
0xab
0x34
0x0003
0xcd
0x12
x86系列的CPU都是little-endian的字節序。

Endian開發中的應用

byte[]
bytes={0,0,0,25};
//Ifthesystemarchitectureislittle-endian(thatis,littleendfirst),
//reversethebytearray.
if(BitConverter.IsLittleEndian)
Array.Reverse(bytes);
inti=BitConverter.ToInt32(bytes,0);
Console.WriteLine("int:{0}",i);
//Output:int:25
在此示例中,調用 BitConverter 類的 GetBytes(Int32) 方法以將 int 轉換為字節數組
參考資料