「endian」這個詞出自《格列佛遊記》。小人國的內戰就源於吃雞蛋時是究竟從大頭(big-endian)敲開還是從小頭(little-endian)敲開,由此曾發生過六次叛亂,其中乙個皇帝送了命,另乙個丟了王位。
我們一般將「endian」翻譯成「位元組序」,將 big-endian 和 little-endian 稱作「大端格式」和「小端格式」。
位元組序是指多位元組資料的儲存順序,在設計計算機系統的時候,有兩種處理記憶體中資料的方法:大端格式、小端格式。
小端格式(little-endian):將低位位元組資料儲存在低位址。
大端格式(big-endian):將高位位元組資料儲存在低位址。
舉個簡單的例子,對於整形 0x12345678,它在大端格式和小端格式的系統中,分別如下圖所示的方式存放:
下面例子為確定主機的位元組序:
#include int main(int argc, char *argv)
輸出結果為:
[root@localhost 9network]# ./a.out
little endian...
[root@localhost 9network]#
。只有在多位元組資料處理時才需要考慮位元組序,執行在同一臺計算機上的程序相互通訊時,一般不用考慮位元組序,異構計算機之間通訊,需要轉換自己的位元組序為網路位元組序。
以下介面所需標頭檔案:#include
uint32_t htonl(uint32_t hostint32);
功能:
將 32 位主機位元組序資料轉換成網路位元組序資料引數:
hostint32:需要轉換的 32 位主機位元組序資料,uint32_t 為 32 為無符號整型返回值:
成功:返回網路位元組序的值uint16_t htons(uint16_t hostint16);功能:
將 16 位主機位元組序資料轉換成網路位元組序資料引數:
hostint16:需要轉換的 16 位主機位元組序資料,uint16_t,unsigned short int返回值:
成功:返回網路位元組序的值測試示例:
#include #include int main(int argc, char *argv)
執行結果如下:
功能:
將 32 位網路位元組序資料轉換成主機位元組序資料引數:
netint32:待轉換的 32 位網路位元組序資料,uint32_t,unsigned int返回值:
成功:返回主機位元組序的值uint16_t ntohs(uint16_t netint16);功能:
將 16 位網路位元組序資料轉換成主機位元組序資料引數:
netint16:待轉換的 16 位網路位元組序資料,uint16_t,unsigned short int返回值:
成功:返回主機位元組序的值
以下介面所需標頭檔案:#include
int inet_pton(int family, const char *strptr, void *addrptr);
功能:
將點分十進位制數串轉換成 32 位無符號整數引數:
family:協議族( af_inet、af_inet6、pf_packet 等 ),常用 af_inet返回值:strptr:點分十進位制數串
addrptr:32 位無符號整數的位址
成功返回 1 、 失敗返回其它測試示例:
#include #include #include #include #include #include int main(void)
執行結果如下:
功能:
將 32 位無符號整數轉換成點分十進位制數串引數:
family:協議族( af_inet、af_inet6、pf_packet 等 ),常用 af_inetaddrptr:32 位無符號整數
strptr:點分十進位制數串
len:strptr 快取區長度
len 的巨集定義
#define inet_addrstrlen 16 // for ipv4
#define inet6_addrstrlen 46 // for ipv6返回值:
成功:則返回字串的首位址測試示例:失敗:返回 null
#include #include #include #include #include #include int main(int argc, char **argv)
; char buf[16] = ;
inet_ntop(af_inet, ip, buf, 16);
printf("buf: %s\n", buf);
return 0;
}
執行結果如下:
參考**:
Linux網路程式設計 主機位元組序 與 網路位元組序
網域名稱轉換ip位址 首先需要理解大端模式與小端模式這兩個點 這兩種模式代表著資料在記憶體中是如何存放的,我們直到,乙個位元組能夠存放8位,如果是超過8位的資料該怎樣存放呢?如需要存放資料 0x12345678 不難看出,大端模式也就是高位優先存放,小端模式也就是低位優先存放。下面學習兩類函式 ht...
Linux網路程式設計 位元組序
1 談到位元組序,那麼會有朋友問什麼是位元組序 非常easy 比如乙個16位的整數。由2個位元組組成,8位為一位元組,有的系統會將高位元組放在記憶體低的位址上,有的則將低位元組放在記憶體高的位址上,所以存在位元組序的問題。2 那麼什麼是高位元組 低位元組?也相當簡單 乙個16進製制整數有兩個位元組組...
Linux網路程式設計 位元組序
與同一臺計算機上的程序進行通訊時,一般不用考慮位元組序,位元組序是乙個處理器架構特性,用於指示像整數計算的大資料型別內部的位元組如何排序。假設上圖圖 中在記憶體 0x1000 到 0x1003 這連續的 4 個位元組儲存了資料,這段資料對應的資料型別是 int 型別。我們知道 int 型別的資料在大...