在跨平臺和網絡編程中咱們常常會提到網絡字節序和主機字節序,若是沒有正確對二者進行轉換,從而致使兩方產生了不一樣的解釋,就會出現意想不到的bug。編程
0x01 概念網絡
0x02 分類操作系統
0x03 兩種字節序之間的區別3d
字節序,就是大於一個字節類型的數據在內存中的存放順序。code
注:網絡字節序是TCP/IP中規定好的一種數據表示格式,它與具體的CPU類型、操做系統等無關,從而能夠保證數據在不一樣主機之間傳輸時可以被正確解釋,網絡字節序採用大端排序方式。blog
字節序常常被分爲大端和小端兩種排序
Big-Endian(大端):高位字節排放在內存的低地址端,低位字節排放在內存的高地址端。內存
Little-Endian(小端):低位字節排放在內存的低地址端,高位字節排放在內存的高地址端。get
一般咱們的主機字節序是小端字節序,網絡字節序是大端字節序,可是爲何要進行轉換呢,若是不轉換的話會發生什麼,咱們這裏用一個不是很恰當的方式來解釋一下。博客
咱們假設使用大端的方式發送一個16bit
的數據2,即0000000000000010
使用小端字節序存儲的話,是這個樣子的
而大端存儲是下面這個樣子的
雖然二者看起來僅僅只是存放的前後順序不同,可是若是不作相應的轉換的話,將會致使所讀取的數據徹底不一樣
這裏還拿上面的這個圖來講
當咱們使用小端方式來讀的時候會出現下面這樣的情況
因爲先將00000010
存儲了,在讀取的時候會先將它讀出來,數據就變成了0000001000000000
即512,而不是當時所要輸入的數字2。
而此時繼續經過大端方式來讀取就會獲取正常的數據值
經過上面的這個方式便很容易的清楚了不重視兩種存儲方式而形成的後果
最後用網上的一個圖來展現一下轉換的傳輸過程
在C++編程中,咱們經過使用htonl、ntohl、htons、ntohs來進行轉換的。
本文由博客一文多發平臺 OpenWrite 發佈!