位元組序處理函式

2021-06-01 00:05:46 字數 2057 閱讀 3218

首先在msdn上查詢htons、 htonl、 ntohl、 ntohs幾個函式的說明介紹,它們是用來轉換本地計算機和網路計算機位元組序的;

那麼,它們一定可以用來出來位元組序問題(拋開網路流不談):

上述的「htons」中的「h」是host主機端,「n」是network網路端。

網路傳輸是使用大端位元組序的(先傳送高位元組,後傳送低位元組),即「htons」中的「n」是大端的,因此hton型別的函式是「小端-->大端」,ntoh型別的函式是「大端-->

小端」

(在實現時,hton就是ntoh,後面說明)

#include #include #pragma comment(lib, "ws2_32.lib")

void main()

引申:

1. 在網路上傳輸位元組流時,比如兩台x86計算機傳輸時,不管兩台計算機同時安裝的時dos、linux、windows、wince等等,或者分別安裝不同的系統,只要cpu平台相同,那麼按照透明的格式傳輸即可,就是用不到上述這幾個函式,怎麼樣的方式傳送,怎麼樣的方式接收,就能保證資料是正確的;

也就是說,x86平台是小端的,arm平台是小端的,而powerpc平台是大端的,在不同cpu平台通訊是要特別注意。

例如,乙個幀串,一般的最後兩個位元組(通常用unsigned short表達)都是前面串的累加和,大端和小端不同的平台架構按照相同的累加演算法,計算出的累加和是不同的!!

2. 判斷小端還是大端的函式:

bool am_little_endian ()

int main()

else

return 0;

}

3. 大端和小端轉換巨集定義: htons或者ntohs都定義為swap16,使用者自己決定當前環境工作大端還是小端下。

typedef unsigned short	uint16;

typedef unsigned int uint32;

#define swap16(a) ((((uint16)(a) & 0xff00) >> 8) | \

(((uint16)(a) & 0x00ff) << 8))

#define swap32(a) ((((uint32)(a) & 0xff000000) >> 24) | \

(((uint32)(a) & 0x00ff0000) >> 8) | \

(((uint32)(a) & 0x0000ff00) << 8) | \

(((uint32)(a) & 0x000000ff) << 24))

64位:

typedef unsigned long long    uint64;  

#define swap64(val) ((uint64) ( \

(((uint64) (val) & (uint64) (0x00000000000000ff)) << 56) |\

(((uint64) (val) & (uint64) (0x000000000000ff00)) << 40) | \

(((uint64) (val) & (uint64) (0x0000000000ff0000)) << 24) | \

(((uint64) (val) & (uint64) (0x00000000ff000000)) << 8) | \

(((uint64) (val) & (uint64) (0x000000ff00000000)) >> 8) | \

(((uint64) (val) & (uint64) (0x0000ff0000000000)) >> 24) | \

(((uint64) (val) & (uint64) (0x00ff000000000000)) >> 40) | \

(((uint64) (val) & (uint64) (0xff00000000000000)) >> 56)))

位元組序及位元組排序函式

主機位元組序 多於乙個位元組的資料型別 多位元組資料型別 在記憶體中的存放順序叫主機位元組序。最常見的位元組序有兩種 小端位元組序和大端位元組序。小端位元組序 little endian,簡稱le,將資料的最低位元組放在記憶體的起始位置。也就是說,記憶體位址較低的位元組位存放資料的低位位元組,記憶體...

大端位元組序 小端位元組序(網路位元組序 主機位元組序)

大端位元組序 整數的高位位元組儲存在記憶體的低位址處,低位元組儲存在記憶體的高位址處。一般pc大多採用小端位元組序,也稱為主機位元組序。網路上傳輸採用大端位元組序,也稱為網路位元組序。linux中常用轉換函式如下 include uint32 t htonl uint32 t hostlong 無符...

網路位元組序與主機位元組序及相關函式

為了弄明白這個位元組序的區分,我們首先需要知道為什麼會有這兩種位元組序。根本原因在於多位元組資料的儲存方式,即大小端問題。假設有乙個四位元組的 int 物件 int a 01020304 16 01020304 16 a 的最低位元組為 0416 0416 最高位元組為 0116 0116 其儲存的...