字節序轉換詳解

在跨平臺和網絡編程中咱們常常會提到網絡字節序和主機字節序,若是沒有正確對二者進行轉換,從而致使兩方產生了不一樣的解釋,就會出現意想不到的bug。編程

目錄

0x01 概念網絡

0x02 分類操作系統

0x03 兩種字節序之間的區別3d

0x01 概念

字節序,就是大於一個字節類型的數據在內存中的存放順序。code

注:網絡字節序是TCP/IP中規定好的一種數據表示格式,它與具體的CPU類型、操做系統等無關,從而能夠保證數據在不一樣主機之間傳輸時可以被正確解釋,網絡字節序採用大端排序方式。blog

0x02 分類

字節序常常被分爲大端和小端兩種排序

Big-Endian(大端):高位字節排放在內存的低地址端,低位字節排放在內存的高地址端。內存

Little-Endian(小端):低位字節排放在內存的低地址端,高位字節排放在內存的高地址端。get

0x03 兩種字節序之間的區別

一般咱們的主機字節序是小端字節序,網絡字節序是大端字節序,可是爲何要進行轉換呢,若是不轉換的話會發生什麼,咱們這裏用一個不是很恰當的方式來解釋一下。博客

咱們假設使用大端的方式發送一個16bit的數據2,即0000000000000010

使用小端字節序存儲的話,是這個樣子的

file

而大端存儲是下面這個樣子的

file

雖然二者看起來僅僅只是存放的前後順序不同,可是若是不作相應的轉換的話,將會致使所讀取的數據徹底不一樣

這裏還拿上面的這個圖來講

當咱們使用小端方式來讀的時候會出現下面這樣的情況

file

因爲先將00000010存儲了,在讀取的時候會先將它讀出來,數據就變成了0000001000000000即512,而不是當時所要輸入的數字2。

而此時繼續經過大端方式來讀取就會獲取正常的數據值

file

經過上面的這個方式便很容易的清楚了不重視兩種存儲方式而形成的後果

最後用網上的一個圖來展現一下轉換的傳輸過程

file

在C++編程中,咱們經過使用htonl、ntohl、htons、ntohs來進行轉換的。

本文由博客一文多發平臺 OpenWrite 發佈!

相關文章
相關標籤/搜索