什麼是位元組序?是指整數在記憶體中儲存的順序。
位元組序有兩種:
a.little endinan 低位儲存在記憶體的低位址,高位儲存在記憶體的高位址;
b.big endian 高位儲存在記憶體的低位址,低位儲存在記憶體的高位址;
舉個簡單的例子:
dword dwcount = 0x01020304;這樣的乙個雙位元組變數在記憶體中如下分布0013ff70 04 03 02 01
(注:實驗結果取之 xpsp3 vc6.0,說明我的機器是little endinan序)
而如果是big endian序的話,應該是0013ff70 01 02 03 04。用的比較多的x86系列的cpu,都是little endinan序的。
而網路位元組序這是tcp/ip協議中定義好的一種資料表示格式,它是與你的機器的cpu,作業系統什麼的無關的,這樣可以保證資料在網路中傳輸時,不管怎麼樣都能正確的解釋了,網路位元組序選擇了big endian。這樣就給編寫網路程式的程式設計師帶來乙個問題,程式設計師必須把本地資料從主機位元組序轉換成網路位元組序傳送到主機,同時,主機也必須把收到的資料從網路位元組序轉換成本地位元組序,這樣才能保證雙方正確的收發資料,不然就是產生bug。
winapi提供了四個函式用於進行網路位元組序到本機位元組序和本機位元組序到網路位元組序的轉換:
htons:把unsigned short型別從主機序轉換到網路序
htonl:把unsigned long型別從主機序轉換到網路序
ntohs:把unsigned short型別從網路序轉換到主機序
ntohl:把unsigned long型別從網路序轉換到主機序
(這四個api可以這樣記,s表示short,l表示long,n表示network,h表示host)
另外:char型別是沒有位元組序的問題的,只有大於乙個位元組的資料型別才有位元組序的問題。很多翻譯書籍將little endinan翻譯成小端模式,將big endian翻譯成大端模式。
關於網路位元組序和主機位元組序
我們在進行網路程式設計的時候,有時候會遇到位元組序轉換的問題,為什麼呢?因為我們都知道計算機對於資料的儲存有兩種方式,一種是大端模式,一種是小端模式,但是我們資料在網路上傳輸都是大端模式,這是為了統一。當我們傳送端主機是小端模式時,我們要將主機的小端模式的位元組序轉換成網路的大端模式 當我們接收端主...
網路位元組序和主機位元組序
不同的 cpu有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序 最常見的有兩種1 little endian2 big endian le little endian 最符合人的思維的位元組序 位址低位儲存值的低位 位址高位儲存值的高位 怎麼講是最符合人的思維的位元組序...
主機位元組序和網路位元組序
1.主機位元組序和網路位元組序1 以下是從ip.h和tcp.h取的,但bsd和linux用的名稱有些不一樣主要是tcp不一樣 struct ip struct tcphdr 我所理解的big序和little序的區別 1 存整數的時候 uint32 t a 1574 1574 0x626 big序 0...