說一說位元組序的基礎知識

2021-10-04 10:23:43 字數 1440 閱讀 4690

------------- codingbook2020 -------------

今天我們來學習一下在網路程式設計中乙個很重要的問題:位元組序

在使用網路進行程式設計中會碰到的乙個問題是位元組序的問題,這在基於單機或者同型別機器進行開發的過程中很少遇到。由於網路的特點是將 internet 上不同的網路裝置和主機進行連線和通訊,這決定了使用網路進行開發的程式的特點就是要相容各種型別的裝置,其中的資料在不同的裝置上要有唯一的含義。位元組序的問題是上述情況下的典型問題。

位元組序的問題是由於 cpu 對整數在記憶體中存放方式的不同而造成的。多於乙個位元組的資料型別在記憶體中的存放順序主機位元組序。最常見的位元組序有兩種,小端位元組序大端位元組序

例如,對於乙個 8 位位元組的資料 0x12345678 ,假設在記憶體中存放的起始位址為 0x1000,則在小端位元組序系統和大端位元組序系統中的方式如下圖所示。

下面我們通過乙個簡單的例子來獲取筆者所使用主機的位元組序:

#include union test ;

int main()

/*執行結果:

sizeof(short) = 2

sizeof(char) = 1

numb = 1234

c[0] = 34

c[1] = 12

*/

從執行結果中,我們可以清晰地看出,低位位址存放的是低位元組資料,高位位址存放的是高位元組資料,所以筆者主機使用的是小端位元組序(cpu: x86 intel core i5)。

系統對多位元組資料的不同存放方式造成了使用上的問題。例如,在 x86 系統的主機 a 上的乙個值為 0x12345678 ,資料通過網路傳送到 powerpc 上的乙個執行 unix 的主機 b 上,在 b 上此值解釋為 0x78563412 ,與原來的資料迥異,這就造成了傳輸上相容性方面的困難。

網路的位元組序標準規定為大端位元組序,不同平台上會對主機位元組序進行轉化後在進行傳送,到主機後在轉化為主機位元組序,這樣資料的傳輸就不會產生問題了。同乙個資料在不同的平台上可以使用網路位元組序的轉換函式來實現。

進行網路位元組序轉換的函式有htons()ntohs()htonl()ntohl()。其中,s 是 short 資料型別的意思,l 是 long 資料型別的意思,而 h 是主機(host)的意思,n 是網路(network)的意思。

位元組序的轉換函式並沒有轉換符號型別變數,是否為符號型別是由應用程式來確定的,與位元組序無關。位元組序轉換函式在不同平台上的實現是不同的,如對於 long 型別的轉換,小端主機位元組序的平台要進行轉換,而在大端主機位元組序的平台上是不需要進行轉換的。

基礎知識 說一說c 中四種cast轉換

c 中四種型別轉換是 static cast,dynamic cast,const cast,reinterpret cast 1 const cast 用於將const變數轉為非const 2 static cast 用於各種隱式轉換,比如非const轉const,void 轉指標等,static...

簡單的說一說mmap

mmap memory map,就是記憶體對映 簡單的說就是將檔案對映到使用者的位址空間中。這麼做有什麼好處呢?1.傳統檔案訪問方式是,首先用open系統呼叫開啟檔案,然後使用read,write等呼叫進行順序或者隨即的i o.這種方式是非常低效的,每一次i o操作都需要一次系統呼叫.而通過mmap...

說一說JS的IIFE

iife immediately invoked function expression,意為立即呼叫的函式表示式,也就是說,宣告函式的同時立即呼叫這個函式。對比一下,這是不採用iife時的函式宣告和函式呼叫 function foo foo 下面是iife形式的函式呼叫 functionfoo 函...