位元組序,顧名思義位元組的順序,就是大於乙個位元組型別的資料在記憶體中的存放順序(乙個位元組的資料當然就無需談順序的問題了)。位元組序分為大端位元組序(big-endian) 和小端位元組序(little-endian)。大端位元組序是指乙個整數的最高位位元組(23 ~ 31 bit)儲存在記憶體的低位址處,低位位元組(0 ~ 7 bit)儲存在記憶體的高位址處;小端位元組序則是指整數的高位位元組儲存在記憶體的高位址處,而低位位元組則儲存在記憶體的低位址處。
/*
位元組序:位元組在記憶體中儲存的順序。
*/// 通過**檢測當前主機的位元組序
#include
intmain()
test;
test.value =
0x0102;if
((test.bytes[0]
==1)&&
(test.bytes[1]
==2))
elseif(
(test.bytes[0]
==2)&&
(test.bytes[1]
==1))
else
return0;
}
網路位元組順序是 tcp/ip 中規定好的一種資料表示格式,它與具體的 cpu 型別、作業系統等無關,從而可以保證資料在不同主機之間傳輸時能夠被正確解釋,網路位元組順序採用大端排序方式。
bsd socket提供了封裝好的轉換介面,方便程式設計師使用。包括從主機位元組序到網路位元組序的轉換函式:htons、htonl;從網路位元組序到主機位元組序的轉換函式:ntohs、ntohl。
#include
// 轉換埠
uint16_t htons
(uint16_t hostshort)
;// 主機位元組序 - 網路位元組序
uint16_t ntohs
(uint16_t netshort)
;// 主機位元組序 - 網路位元組序
// 轉ip
uint32_t htonl
(uint32_t hostlong)
;// 主機位元組序 - 網路位元組序
uint32_t ntohl
(uint32_t netlong)
;// 主機位元組序 - 網路位元組序
示例:小端序轉大端序,本機必須是小端序
/*
網路通訊時,需要將主機位元組序轉換成網路位元組序(大端),
另外一段獲取到資料以後根據情況將網路位元組序轉換成主機位元組序。
// 轉換埠
uint16_t htons(uint16_t hostshort); // 主機位元組序 - 網路位元組序
uint16_t ntohs(uint16_t netshort); // 主機位元組序 - 網路位元組序
// 轉ip
uint32_t htonl(uint32_t hostlong); // 主機位元組序 - 網路位元組序
uint32_t ntohl(uint32_t netlong); // 主機位元組序 - 網路位元組序
*/#include
#include
intmain()
;int num =*(
int*
)buf;
int sum =
htonl
(num)
;unsigned
char
*p =
(char*)
∑printf
("%d %d %d %d\n"
,*p,
*(p+1)
,*(p+2),
*(p+3)
);printf
("********************===\n");
// ntohl
unsigned
char buf1[4]
=;int num1 =*(
int*
)buf1;
int sum1 =
ntohl
(num1)
;unsigned
char
*p1 =
(unsigned
char*)
&sum1;
printf
("%d %d %d %d\n"
,*p1,
*(p1+1)
,*(p1+2)
,*(p1+3)
);// ntohs
return0;
}
網路程式設計 位元組序
三 位址形式的轉換函式 當儲存多位元組資料時,就涉及到位元組序的概念。高位位元組儲存在低位址為大端對齊,低位位元組儲存在低位址為小端對齊。判斷系統為大端對齊還是小端對齊的方法 include typedef union data intmain int argc,char ar else if ob...
網路程式設計 網路位元組序和位址位元組序轉化
網路位元組序是大端序,而記憶體位元組序是小端序 就像彙編學的內容一致 大端序 高位位元組存放到地位位址 小端序 高位位元組存放在高位位址 因此在位址傳輸時需要將位址進行轉化 short unsigned short htons unsigned short h to n,主機轉化成網路資料 s sh...
Linux網路程式設計 主機位元組序 與 網路位元組序
網域名稱轉換ip位址 首先需要理解大端模式與小端模式這兩個點 這兩種模式代表著資料在記憶體中是如何存放的,我們直到,乙個位元組能夠存放8位,如果是超過8位的資料該怎樣存放呢?如需要存放資料 0x12345678 不難看出,大端模式也就是高位優先存放,小端模式也就是低位優先存放。下面學習兩類函式 ht...