剛才閱讀**的時候看到了乙個位元組排序函式,一時想不起具體用法了。想想學習linux下的網路程式設計也不少時間了,這些位元組排序和轉換的函式還是不太清楚,容易混淆。今天索性把這方面的知識彙總一下,爭取以後能夠熟練的認識和運用。
位元組順序函式:
小端位元組序:將低序位元組儲存在起始位址。(linux)
大端位元組序:將高序位元組儲存在起始位址。(網路位元組序)
舉個例子:對於整數0x12345678來說,在不同的系統中存放的方式如下圖:
正是因為網際協議採取的是大端位元組序,我們在程式設計的時候才需要考慮網路位元組許和主機位元組序之間的轉換。下面是四個轉換函式(在某些採用大端位元組序的系統裡面,這四個函式被定位空巨集):
[cpp]view plain
copy
print?
#include
uint16_t htons(uint16_t host16bitvalue);
uint32_t htonl(uint32_t host32bitvalue); //均返回網路位元組序
uint16_t ntohs(uint16_t net16bitvalue);
uint32_t ntohl(uint32_t net32bitvalue); //均返回主機位元組序
[cpp]view plain
copy
print?
#include
int inet_aton(const
char *strptr, struct in_addr *addrptr);
//返回:1——串有效,0——串有錯
char* inet_ntoa(struct in_addr inaddr);
//返回乙個指向ascii字串的指標
in_addr_t inet_addr(const
char *strptr);
//成功返回網路位元組序,錯誤返回inaddr_none
接下來是第二組,這兩個函式比較新,對於ipv4和ipv6都能處理。p的含義是presentation,代表ascii字串。n的含意是numberic,代表網路位址值。
[cpp]view plain
copy
print?
#include
#define inet_addrstrlen 16
#define inet6_addrstrlen 46
#include
int inet_pton(int family, const
char *strptr, void *addrptr);
//返回:1——成功,輸入的不是有效表達格式,-1——出錯
const
char* inet_ntop(int family, const
void *addrptr, char *strptr, size_t len);
//返回:指向結果的指標——成功,null——出錯
位元組序,位址轉換
位元組序,位址轉換 位元組序 是指多位元組資料在計算機記憶體中儲存或者網路傳輸時各位元組的儲存順 序。兩種格式 大端和小端。小端 高位址存放高位數,低位址存放低位數 大端 高位址存放低位數,低位址存放高位數 驗證主機的位元組序 include int main 輸出結果為 12時 為大端 輸出結果為...
Linux網路程式設計 位元組序 位址轉換函式
1 談到位元組序,那麼會有朋友問什麼是位元組序 很簡單 例如乙個16位的整數,由2個位元組組成,8位為一位元組,有的系統會將高位元組放在記憶體低的位址上,有的則將低位元組放在記憶體高的位址上,所以存在位元組序的問題。2 那麼什麼是高位元組 低位元組?也相當簡單 乙個16進製制整數有兩個位元組組成,例...
linux網路程式設計 網路位元組序 位址轉換
endian 這個詞出自 格列佛遊記 小人國的內戰就源於吃雞蛋時是究竟從大頭 big endian 敲開還是從小頭 little endian 敲開,由此曾發生過六次叛亂,其中乙個皇帝送了命,另乙個丟了王位。我們一般將 endian 翻譯成 位元組序 將 big endian 和 little en...