long long型別的主機位元組序和網路位元組序轉換

2021-10-06 09:21:48 字數 2158 閱讀 1913

在網路程式設計中經常會碰到網路位元組序和主機位元組序。關於網路位元組序和主機位元組序在學習前需要理解以下幾個概念。

位元組序,指的是位元組在記憶體中儲存的順序,比如乙個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...