Linux網路程式設計 位元組序

2022-09-16 12:42:08 字數 1491 閱讀 2566

與同一臺計算機上的程序進行通訊時,一般不用考慮位元組序,位元組序是乙個處理器架構特性,用於指示像整數計算的大資料型別內部的位元組如何排序。

假設上圖圖 中在記憶體 0x1000 到 0x1003 這連續的 4 個位元組儲存了資料,這段資料對應的資料型別是 int 型別。我們知道 int 型別的資料在大多數編譯器實現中都是 4 位元組。

那麼上圖這個 int 型別資料,到底是 0x10203040 還是 0x40302010?實際上這是依賴於處理器架構的。

對於 little-endian (小端)機器來說,這 4 位元組資料被解釋成 int 型別的話它就是 0x10203040,對於 big-endian (大端)機器來說,它被解釋成 0x40302010.

1. 小端表示資料的低位(低位元組)儲存在記憶體的低位址部分,資料的高位(高位元組)儲存在記憶體的高位址部分。

2. 大端表示資料的高位(高位元組)儲存在記憶體的高位址部分,資料的低位(低位元組)儲存在記憶體的低位址部分。

按照這個規則,對於小端機器來說,高位址 0x1003 這個位置儲存的是資料最高位,0x1000 這個位址儲存的是資料的最低位,所以最終的 int 型別資料就是 0x10203040.

注意:大部分情況下,我們的使用都是小端機器,intel 處理器和 amd 處理器基本上都是小端的。但是也有一些處理器是大端的。tcp協議棧使用大端位元組序(網路位元組序)。

對於tcp/ip應用程式,有4個用來在處理位元組序和網路位元組序之間實施轉換的函式。

#include uint32_t htonl(uint32_t hostlong); 

//返回值:以網路位元組序表示的32位整數

uint16_t htons(uint16_t hostshort);

//返回值:以網路位元組序表表示16位整數

uint32_t ntohl(uint32_t netlong);

//返回值:以主機位元組序表示的32位整數

uint16_t ntohs(uint16_t netshort);

//返回值:以主機位元組序表示16位整數

例1:

1 #include 2 #include 3

4union int5;

910intmain()

1123 puts(""

);24

25 printf("

b = 0x%08x\n

", b.x);

26for (i = 0; i < 4; ++i)

2730

return0;

31 }

輸出:

1. 128-位元組序 【allen】

Linux網路程式設計 位元組序

1 談到位元組序,那麼會有朋友問什麼是位元組序 非常easy 比如乙個16位的整數。由2個位元組組成,8位為一位元組,有的系統會將高位元組放在記憶體低的位址上,有的則將低位元組放在記憶體高的位址上,所以存在位元組序的問題。2 那麼什麼是高位元組 低位元組?也相當簡單 乙個16進製制整數有兩個位元組組...

Linux網路程式設計 主機位元組序 與 網路位元組序

網域名稱轉換ip位址 首先需要理解大端模式與小端模式這兩個點 這兩種模式代表著資料在記憶體中是如何存放的,我們直到,乙個位元組能夠存放8位,如果是超過8位的資料該怎樣存放呢?如需要存放資料 0x12345678 不難看出,大端模式也就是高位優先存放,小端模式也就是低位優先存放。下面學習兩類函式 ht...

網路程式設計 位元組序

三 位址形式的轉換函式 當儲存多位元組資料時,就涉及到位元組序的概念。高位位元組儲存在低位址為大端對齊,低位位元組儲存在低位址為小端對齊。判斷系統為大端對齊還是小端對齊的方法 include typedef union data intmain int argc,char ar else if ob...