字節序,顧名思義就是字節的順序。更具體的講,它是多字節數據存儲和傳輸時,字節的順序。java
由於物理內存是以字節爲單位進行數據存儲,也就是咱們常說的計算機基本單位爲字節。
所以,單字節的數據(如c或java的char類型的數據)沒有字節序這一說,由於獲取它只須要讀取一個字節。而多字節數據,因爲有多個字節,因此在存儲和傳輸可使用不一樣的順序進行操做。數組
十六進制數 0x12345678 共佔4個字節,分別是0x十二、0x3四、0x5六、0x78,所以在該數字中0x12屬於高位數據,0x78屬於地位數據。網絡
注:
能夠把內存當作是一個很大的數組,4G內存則是一個長度爲4294967296的數組。
該數組的索引其實就是內存地址,左邊是比較小的地址,右邊則愈來愈大,直至最大值。
第一種順序:低地址存放高位數據,叫大端模式spa
第二種順序:低地址存放低位數據,叫小端模式code
二者,大端模式比較符合人類的閱讀習慣;小端模式更符合計算機的處理方式,由於計算機從低位開始處理。blog
網絡序:也稱爲網絡字節序,都是大端模式。由於TCP/IP協議對各層協議統一規定採用大端模式。索引
主機序:機器的字節序,有大端模式也有小端模式,根據具體機器的處理決定的,小端模式較常見。圖片
那麼,在進行網絡通信時,在將本地數據發送到網絡上就須要注意這個順序。若是本地機器的字節序是小端模式,則須要先轉換成大端模式後再進行發送;若是本地已是大端模式,則能夠直接發送。內存
ps.在私有協議上的數據,只要收發兩端約定好,用什麼順序都行。不過,仍是建議用網絡序發送。it
int main() { int x = 0x1020304; char* p = (char*)&x; if(p[0]==1){ printf("Big\n"); } else{ printf("Little\n"); } return 0; }
public class HelloEndian { public static void main(String[] args) { ByteBuffer b = ByteBuffer.wrap(new byte[4]); b.order(ByteOrder.BIG_ENDIAN); b.putInt(0x01020304); System.out.println("Big-Endian: " + Arrays.toString(b.array())); b = ByteBuffer.wrap(new byte[4]); b.order(ByteOrder.LITTLE_ENDIAN); b.putInt(0x01020304); System.out.println("Little-Endian: " + Arrays.toString(b.array())); } }