位元組排序函式

2021-08-07 07:34:49 字數 1706 閱讀 9785

位元組序是指多位元組資料在計算機記憶體中儲存或者網路傳輸時各位元組的儲存順序。

consider a 16-bit integer that is made up of 2 bytes. there are two ways to store the twobytes in memory: with the low-order byte at the starting address, known as little-endian byteorder, or with the high-order byte at the starting address, known as big-endian byte order

主機位元組序

不同的主機有不同的位元組序,如x86為小端位元組序,motorola 6800為大端位元組序,arm位元組序是可配置的。

網路位元組序

網路位元組順序是tcp/ip中規定好的一種資料表示格式,它與具體的cpu型別、作業系統等無關,從而可以保證資料在不同主機之間傳輸時能夠被正確解釋。網路位元組順序採用big endian排序方式

為使網路程式具有可移植性,使同樣的c**在大端和小端計算機上編譯後都能正常執行,可以呼叫以下庫函式做網路位元組序和主機位元組序的轉換。

#include uint32_t htonl(uint32_t hostlong);  

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

這些函式名很好記:

例如htonl表示將32位的長整數從主機位元組序轉換為網路位元組序,例如將ip位址轉換後準備傳送。如果主機是小端位元組序,這些函式將引數做相應的大小端轉換然後返回,如果主機是大端位元組序,這些函式不做轉換,將引數原封不動地返回。

《unix網路程式設計 卷1:套接字聯網api(第3版)》

中檢查主機的大端小端程式如下:

#include "unp.h"

int main(int argc, char **argv)

un;un.s = 0x0102; //短整數變數中存放2個位元組的值0x0102

if(sizeof(short) == 2) else

printf("sizeof(short) = %lu\n", sizeof(short));

exit(0);

}

還有乙個更加簡明的方式,如下:

#include #include int main(void)

輸出:

78 56 34 12  

12 34 56 78

即本主機是小端位元組序,而經過htonl轉換後為網路位元組序,即大端。

參考:

1.《unix網路程式設計 卷1:套接字聯網api(第3版)》

2. unix網路程式設計——socket概述和位元組序、位址轉換函式

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

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

位元組排序函式與位元組操縱函式

考慮乙個16bit的整數,它由2個位元組組成。記憶體中儲存這兩個位元組有兩種方法 一種是將低序位元組儲存在起始位置,這種稱為小端 little endian 位元組序,另一種是將高序位元組儲存在起始位址,這稱為大端 bin endian 位元組序。msb 最高有效位 16位數的最左一位。lsb 最低...

位元組序處理函式

首先在msdn上查詢htons htonl ntohl ntohs幾個函式的說明介紹,它們是用來轉換本地計算機和網路計算機位元組序的 那麼,它們一定可以用來出來位元組序問題 拋開網路流不談 上述的 htons 中的 h 是host主機端,n 是network網路端。網路傳輸是使用大端位元組序的 先傳...