乙個位元組8位剛好儲存兩個十六進的數字。網路位元組序即為大頭位元組序。
判斷當前平台是大頭還是小頭:
#define bigendian (htons(1) == 1)
當htons(1) == 1成立時,bigendian的值就是1,否則為0. 後續**就可以通過 if (bigendian) 的形式來判斷大小頭。
各作業系統都會實現這個函式:
unit16_t htons(uint16_t host);
將16位主機字元順序轉換成網路字元順序
如果主機位元組序是小頭,則返回十進位制host對應的大頭;
如果主機位元組序是大頭,則返回十進位制host對應的大頭(即不需要轉換,本身就是大頭).
主機的位元組序是大頭還是小頭由htons自己去確定。
假設主機為小頭位元組序,那麼十進位制數字1(十六進製制數字就是0x0001)的主機位元組序就是:
0x0100
用htons將0x0100按小頭位元組序轉換為網路位元組序(大頭)是:
0x0001
即傳入引數host為0x0100,返回值就是0x0001。
而因為程式是在當前平台上執行,所以cpu在讀取16為short時都是按照本級的位元組序小頭來讀的。
cpu是不知道你返回的值是大頭位元組序的,它只知道都按本機的小頭位元組序來讀取。
所以傳入值為0x0100,即十進位制的1;而返回值為0x0001,即256.
轉換位元組序後,本機cpu讀取出來的short的值是不同的。
假設主機是大頭,那麼十進位制數字1(十六進製制數字就是0x0001)的主機位元組序就是:
0x0001
htons不用轉換,直接返回,因為本身就是網路位元組序:
0x0001
即傳入引數host為0x0001,返回值也是0x0001。
cpu都會按本機的位元組序去讀取傳入值和返回值:
傳入值為0x0001,即十進位制的1;而返回值為0x0001,十進位制值就是1.
所以如果本機是大頭,則htons(1) == 1 成立;否則不成立。
大小端位元組序的判斷
最近要重新研究linux網路程式設計,首先都遇到這個問題,記錄複習下吧 本文 大小端位元組序小端位元組序 little endian,將低位元組存放在記憶體的起始位址 大端位元組序 big endian,將高位元組存放在記憶體的起始位址。例如,數字index 0x11223344,在大小端位元組序方...
大小端位元組序的判斷
大小端位元組序是由於cpu和os對大於乙個位元組的變數各個位元組在記憶體中的儲存順序不同而產生的。以佔兩個位元組的十六進製制數0xabcd為例,小端位元組序 15 8 7 0 a bc d 15 8 7 0 c da b typedef unionto int main 網路位元組序統一為大端,主機...
怎麼判斷大小端(網路位元組序和主機位元組序)
怎麼判斷大小端 網路位元組序和主機位元組序 使用union進行判斷,這裡說一下能用union判斷的理由,union所佔的位元組數是union中成員的最大位元組數,也就是說成員們共用同一塊位址。include void byteorder test test.data 0x0102 if test.v...