定義
在各種
計算機體系結構中,對於
位元組、字等的存儲機制有所不同,因而引發了
計算機通信領域中一個很重要的問題,即通信雙方交流的信息單元(
比特、位元組、字、
雙字等等)應該以什麼樣的順序進行傳送。如果不達成一致的規則,通信雙方將無法進行正確的編/
解碼從而導致通信失敗。
目前在各種體系的計算機中,通常採用big-endian和
little-endian兩種位元組存儲機制描述在多位元組數中各個位元組的存儲順序。
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這個詞便隨著這篇論文而被廣為採用。
小端格式和大端格式
小端格式和大端格式(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的位元組序。
程式開發中的套用
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 轉換為
位元組數組。