本頁使用了標題或全文手工轉換

位元組順序

維基百科,自由的百科全書
跳至導覽 跳至搜尋

字節順序,又稱端序尾序英語:Endianness)。在計算機科學領域中,是跨越多字節的程序對象的存儲規則。

在幾乎所有的機器上,多字節對象都被存儲為連續的字節序列。例如在C語言中,一個類型為int的變量x地址為0x100,那麼其對應地址表達式&x的值為0x100。且x的四個字節將被存儲在存儲器0x100, 0x101, 0x102, 0x103位置。[1]

而存儲地址內的排列則有兩個通用規則。一個多位的整數將按照其存儲地址的最低或最高字節排列。如果最低有效位最高有效位的前面,則稱小端序;反之則稱大端序。在網絡應用中,字節序是一個必須被考慮的因素,因為不同機器類型可能採用不同標準的字節序,所以均按照網絡標準轉化。

例如假設上述變量x類型為int,位於地址0x100處,它的十六進制為0x01234567,地址範圍為0x100~0x103字節,其內部排列順序依賴於機器的類型。大端法從首位開始將是:0x100: 01, 0x101: 23,..。而小端法將是:0x100: 67, 0x101: 45,..

端(endian)的起源[編輯]

endian」一詞來源於十八世紀愛爾蘭作家喬納森·斯威夫特(Jonathan Swift)的小說《格列佛遊記》(Gulliver's Travels)。小說中,小人國為水煮蛋該從大的一端(Big-End)剝開還是小的一端(Little-End)剝開而爭論,爭論的雙方分別被稱為「大端派」和「小端派」。以下是1726年關於大小端之爭歷史的描述:

1980年,丹尼·科恩(Danny Cohen),一位網絡協議的早期開發者,在其著名的論文"On Holy Wars and a Plea for Peace"中,為平息一場關於字節該以什麼樣的順序傳送的爭論,而第一次引用了該詞。[2]

字節順序[編輯]

在哪種字節順序更合適的問題上,人們表現得非常情緒化,實際上,就像雞蛋的問題一樣,沒有技術上的原因來選擇字節順序規則,因此,爭論淪為關於社會政治問題的爭論,只要選擇了一種規則並且始終如一地堅持,其實對於哪種字節排序的選擇是任意的。

對於單一的字節(a byte),大部分處理器以相同的順序處理位元(bit),因此單字節的存放方法和傳輸方式一般相同。

對於多字節數據,如整數(32位機中一般占4字節),在不同的處理器的存放方式主要有兩種,以內存中0x0A0B0C0D的存放方式為例,分別有以下幾種方式:

注: 0x前綴代表十六進制。

大端序[編輯]

大端序(英:big-endian)或稱大尾序

Big-Endian.svg
  • 數據以8bit為單位:
地址增長方向  →
... 0x0A 0x0B 0x0C 0x0D ...

示例中,最高位字節是0x0A 存儲在最低的內存地址處。下一個字節0x0B存在後面的地址處。正類似於十六進制字節從左到右的閱讀順序。

  • 數據以16bit為單位:
地址增長方向  →
... 0x0A0B 0x0C0D ...

最高的16bit單元0x0A0B存儲在低位。

小端序[編輯]

小端序(英:little-endian)或稱小尾序

Little-Endian.svg
  • 數據以8bit為單位:
地址增長方向  →
... 0x0D 0x0C 0x0B 0x0A ...

最低位字節是0x0D 存儲在最低的內存地址處。後面字節依次存在後面的地址處。

  • 數據以16bit為單位:
地址增長方向  →
... 0x0C0D 0x0A0B ...

最低的16bit單元0x0C0D存儲在低位。

  • 更改地址的增長方向:

當更改地址的增長方向,使之由右至左時,表格更具有可閱讀性。

←  地址增長方向
... 0x0A 0x0B 0x0C 0x0D ...

最低有效位(LSB)是0x0D 存儲在最低的內存地址處。後面字節依次存在後面的地址處。

←  地址增長方向
... 0x0A0B 0x0C0D ...

最低的16bit單元0x0C0D存儲在低位。

混合序[編輯]

混合序(英:middle-endian)具有更複雜的順序。以PDP-11為例,0x0A0B0C0D被存儲為:

  • 32bit在PDP-11的存儲方式
地址增長方向  →
... 0x0B 0x0A 0x0D 0x0C ...

可以看作高16bit和低16bit以大端序存儲,但16bit內部以小端存儲。

處理器體系[編輯]

網絡序[編輯]

網絡傳輸一般採用大端序,也被稱之為網絡字節序,或網絡序IP協議中定義大端序為網絡字節序。

Berkeley套接字定義了一組轉換函數,用於16和32bit整數在網絡序和本機字節序之間的轉換。htonl,htons用於本機序轉換到網絡序;ntohl,ntohs用於網絡序轉換到本機序。

位序[編輯]

一般用於描述串行設備的傳輸順序。網絡協議中只有數據鏈路層的底端會涉及到。

小端序(先傳低位)的串行協議[編輯]

大端序(先傳高位)的串行協議[編輯]

參見[編輯]

外部連結[編輯]

參考[編輯]

  1. ^ 《深入理解計算機系統》 第2章 信息的表示和處理 P26.
  2. ^ 《深入理解計算機系統》 第2章 信息的表示和處理 P27.