linux網路程式設計中的位元組序轉換

2021-08-08 13:30:21 字數 2002 閱讀 5964

首先解釋一下位元組序的概念,所謂位元組序是指多位元組資料的儲存順序,比如0x1234要放在0000h和0001h兩儲存單元,有兩種儲存方式:大端格式為[0000h]=12,[0001h]=34和小端格式為[0000h]=34,[0001h]=12。

大端格式:將高位位元組資料儲存在低位址,低位位元組資料儲存在高位址

小端格式:將高位位元組資料儲存在高位址,低位位元組資料儲存在低位址

如何自身主機的位元組序呢?看如下乙個小demo你就明白了。可以自己在終端測試一下的,vc6.0也行的。

int main(int argc, char *argv)

un_tmp;

un_tmp.temp = 0x1234;

if ((un_tmp.test[0] == 0x12) && (un_tmp.test[1] == 0x34))

printf("大端格式:高位位元組資料儲存在低位址,低位位元組資料儲存在高位址");

if ((un_tmp.test[0] == 0x34) && (un_tmp.test[1] == 0x12))

printf("小端格式:高位位元組資料儲存在高位址,低位位元組資料儲存在低位址");

return 0;}

●只有在多位元組資料處理時才需要考慮位元組序,單位元組資料根本不存在高低位元組問題

●執行在同一臺計算機上的程序相互通訊時一般不用考慮位元組序

●異構計算機之間的通訊,傳送資料時需要轉換自己的位元組序為網路位元組序(即統一轉換為大端)

●異構計算機之間的通訊,接收資料時需要轉換網路位元組序為主機位元組序

在需要位元組序轉換時,一般使用linux系統下arpa/inet.h標頭檔案特定的轉換函式。具體見如下:

1. 主機位元組序 => 網路位元組序

1.1 將32位主機位元組序資料轉換成網路位元組序資料

uint32_t htonl(uint32_t hostint32);

1.2 將16位主機位元組序資料轉換成網路位元組序資料

uint16_t htons(uint16_t hostint16); 例:

int main(int argc, char *argv)

2. 網路位元組序 =

主機位元組序

2.1 將32位網路位元組序資料轉換成主機位元組序資料

uint32_t ntohl(uint32_t netint32);

2.2 將16位網路位元組序資料轉換成主機位元組序資料

uint16_t ntons(uint16_t netint16); 例:

3. 帶自動轉換位元組序的位址轉換函式

3.1 將點分十進位制ip字串strptr轉換成對應的網路位元組序的32位無符號整數addrptr。

int inet_pton(int family ,const char *strptr ,void *addrptr);  //family是協議棧,一般填af_inet

3.2 將主機位元組序32位無符號整數addrptr轉換成對應的點分十進位制ip字串strptr。

const char *inet_ntop(int family ,const void *addrptr ,char *strptr ,size_t len); 

len的取值:

#define inet_addrstrlen      16

#define inet6_addrstrlen    46 例:

以上幾個函式可以在linux終端下編寫測試程式進行測試(vc6.0下不能測試,沒有標頭檔案),注意要包含對應標頭檔案:#include

#include

#include

文章出自:

Linux網路程式設計 位元組序

1 談到位元組序,那麼會有朋友問什麼是位元組序 非常easy 比如乙個16位的整數。由2個位元組組成,8位為一位元組,有的系統會將高位元組放在記憶體低的位址上,有的則將低位元組放在記憶體高的位址上,所以存在位元組序的問題。2 那麼什麼是高位元組 低位元組?也相當簡單 乙個16進製制整數有兩個位元組組...

Linux網路程式設計 位元組序

與同一臺計算機上的程序進行通訊時,一般不用考慮位元組序,位元組序是乙個處理器架構特性,用於指示像整數計算的大資料型別內部的位元組如何排序。假設上圖圖 中在記憶體 0x1000 到 0x1003 這連續的 4 個位元組儲存了資料,這段資料對應的資料型別是 int 型別。我們知道 int 型別的資料在大...

Linux網路程式設計 主機位元組序 與 網路位元組序

網域名稱轉換ip位址 首先需要理解大端模式與小端模式這兩個點 這兩種模式代表著資料在記憶體中是如何存放的,我們直到,乙個位元組能夠存放8位,如果是超過8位的資料該怎樣存放呢?如需要存放資料 0x12345678 不難看出,大端模式也就是高位優先存放,小端模式也就是低位優先存放。下面學習兩類函式 ht...