網絡編程時的字節順序變換,地址變換

不同的 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轉換成一個長整數型數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章