首先解釋一下位元組序的概念,所謂位元組序是指多位元組資料的儲存順序,比如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...