位元組序轉換詳解

在跨平台和網絡編程中我們經常會提到網絡位元組序和主機位元組序,如果沒有正確對兩者進行轉換,從而導致兩方產生了不同的解釋,就會出現意想不到的bug。

目錄

0x01 概念

0x02 分類

0x03 兩種位元組序之間的區別

0x01 概念

位元組序,就是大於一個位元組類型的數據在內存中的存放順序。

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

0x02 分類

位元組序經常被分為大端和小端兩種

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

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

0x03 兩種位元組序之間的區別

通常我們的主機位元組序是小端位元組序,網絡位元組序是大端位元組序,但是為什麼要進行轉換呢,如果不轉換的話會發生什麼,我們這裡用一個不是很恰當的方式來解釋一下。

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

使用小端位元組序存儲的話,是這個樣子的

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

雖然兩者看起來僅僅只是存放的先後順序不一樣,但是如果不做相應的轉換的話,將會導致所讀取的數據完全不同

這裡還拿上面的這個圖來說

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

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

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

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

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

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