在網路程式設計中經常會碰到網路位元組序和主機位元組序。關於網路位元組序和主機位元組序在學習前需要理解以下幾個概念。
位元組序,指的是位元組在記憶體中儲存的順序,比如乙個int32_t型別的數值占用4個位元組,這4個位元組在記憶體中的排列順序就是位元組序。位元組序有以下兩種:
小端位元組序(little endian),數值低位儲存在記憶體低位址,高位儲存在記憶體高位址。
大端位元組序(big endian),數值高位儲存在記憶體的低位址,低位儲存在記憶體的高位址。
下邊是從網路上找的乙個圖,以32位位寬數值0x12345678為例,小端位元組序與大端位元組序具體的儲存區別如下所示:
下邊是c標準庫提供的關於位元組序間轉換的操作函式:
#include
uint32_t htonl
(uint32_t hostlong)
;//把uint32_t型別從主機序轉換到網路序
uint16_t htons
(uint16_t hostshort)
;//把uint16_t型別從主機序轉換到網路序
uint32_t ntohl
(uint32_t netlong)
;//把uint32_t型別從網路序轉換到主機序
uint16_t ntohs
(uint16_t netshort)
;//把uint16_t型別從網路序轉換到主機序
上邊的幾個函式有對32位和16位的數值轉換,但是如果是64位的就沒有現成的api可以呼叫了,下邊提供幾種實現方式,對64位型別資料進行轉換
//主機序轉網路序
unsigned
long
long
htonll
(unsigned
long
long val)
else
if(__byte_order == __big_endian)
}//網路序轉主機序
unsigned
long
long
ntohll
(unsigned
long
long val)
else
if(__byte_order == __big_endian)
}
下邊使用聯合體的特性:聯合體中所有成員引用的是記憶體中相同的位置,其長度為最長成員的長度。
typedef
struct
int64_t;
typedef
union
convert64_t;
//主機序轉網路序
unsigned
long
long
htonll
(unsigned
long
long val)
else
if(__byte_order == __big_endian)
}//網路序轉主機序
unsigned
long
long
ntohll
(unsigned
long
long val)
else
if(__byte_order == __big_endian)
}
#ifdef win32
#define ntohll(x) _byteswap_uint64 (x)
#define htonll(x) _byteswap_uint64 (x)
#else
#if __byte_order == __big_endian
#define ntohll(x) (x)
#define htonll(x) (x)
#else
#if __byte_order == __little_endian
#define ntohll(x) __bswap_64 (x)
#define htonll(x) __bswap_64 (x)
#endif
#endif
#endif
C C 程式設計 long long型別
資料型別long long是c 11中重新定義的,標準規定它最小是64bit 在這之前為了提供超過32bit的整數,各個開發環境 編譯器 分別定義了各自的64bit整數型別。這會導致 不相容 現在,c 11直接定義了long long型別 我猜許多人應該使用過這個型別,當然在c 11之前,這種嘗試會...
c語言long long型別賦值
long long unsigned int num 20140701092715 在c語言中編譯器會把沒有小數的數值常量預設為整形,這條語句編譯器會報警告 root localhost gcc o test 1.c 1.c in function main 1.c 6 warning intege...
有意思的long long型別移位
這個某人的疑問 這是源程式 include void main 下面是輸出 1111111111111111a 0 22222222222222222a 12884901888 請問第乙個輸出為什麼會是0 下面是我的分析 關鍵是這個long long多少位?lld n又是如何動作的?還有a 12 3...