不同的 CPU 有不同的字節序類型 這些字節序是指整數在內存中保存的順序 這個叫做主機序
最常見的有兩種
1 . Little
endian :將低序字節存儲在起始地址
2 . Big
endian :將高序字節存儲在起始地址
LE little-endian
最符合人的思維的字節序
地址低位存儲值的低位
地址高位存儲值的高位
怎麼講是最符合人的思維的字節序,是因爲從人的第一觀感來說
低位值小,就應該放在內存地址小的地方,也即內存地址低位
反之,高位值就應該放在內存地址大的地方,也即內存地址高位
BE big-endian
最直觀的字節序
地址低位存儲值的高位
地址高位存儲值的低位
爲什麼說直觀,不要考慮對應關係
只需要把內存地址從左到右按照由低到高的順序寫出
把值按照通常的高位到低位的順序寫出
兩者對照,一個字節一個字節的填充進去
寫網絡程序的時候經常會遇到網絡字節順序和主機字節順序不一致的情況,這時就會用到下面這幾個函數
htons(),htonl,ntohs(),ntohl()轉換函數
htons 把 unsigned short 類型從主機序轉換到網絡序htonl 把 unsigned long 類型從主機序轉換到網絡序
ntohs 把 unsigned short 類型從網絡序轉換到主機序
ntohl 把 unsigned long 類型從網絡序轉換到主機序
注:
1 、網絡與主機字節轉換函數 :htons
ntohs htonl ntohl (s 就是 short l 是 long
h 是 host n 是 network)
2 、不同的 CPU 上運行不同的操作系統,字節序也是不同的,
另外還有兩個函數在socket編程的時候會遇到
inet_ntoa();將網絡地址轉換成“.”點隔的字符串格式。
inet_aton();inet_aton是一個改進的方法來將一個字符串IP地址轉換爲一個32位的網絡序列IP地址
inet_addr()的功能是將一個點分十進制的IP轉換成一個長整數型數