1. 程式人生 > >需要注意位元組序的大端(big endian)和小端(little endian)的幾種情景

需要注意位元組序的大端(big endian)和小端(little endian)的幾種情景

大端(big endian):在記憶體中,按照從最低有效位元組到最高有效位元組的順序儲存物件,即資料的高位元組,儲存在記憶體的低地址中,而資料的低位元組,儲存在記憶體的高地址中。
小端(little endian):在記憶體中,按照從最高有效位元組到最低有效位元組的順序儲存物件,即資料的高位元組儲存在記憶體的高地址中,而資料的低位元組儲存在記憶體的低地址中。
下圖舉例摘自CSAPP:
這裡寫圖片描述
大多數Intel相容機都用小端模式,IBM和Oracle的大多數機器使用大端模式。有些比較新的微處理器是雙端法(bi-endian),即可以把它們配置成大端或小端的機器執行。但是,實際上,一旦選擇了特定的作業系統,那麼位元組序也就固定下來了。對多數應用程式設計師來說,位元組序是透明的,不需要關心,但是,在以下幾種情景中,需要注意了:
1、在不同型別的機器之間通過網路傳送二進位制資料時,網路應用程式的編寫必須遵守已建立的位元組序規則,傳送方將它的內部表示轉換成網路標準,而接收方則將網路標準轉換為它的內部表示;
2、在檢查機器級程式時,閱讀表示整數資料的位元組系列時位元組順序很重要;
3、對於有些系統級程式設計來說,有時需要編寫規避正常的型別的程式,比如C中的強制型別轉換(cast)或聯合(union)。
下面給出一個例子檢測當前機器是大端儲存還是小端儲存:

BOOL IsLittleEndianMode()
{
    union _DATA
    {
        int Para1;
        char Para2;
    } data;
    data.Para1 = 1;
    BOOL RetVal = FALSE;
    if ( data.Para2 ==  1 )
    {
        RetVal = TRUE;
    }
    return RetVal;
}