套接字中的資料轉換 大端模式 小端模式

2021-05-21 17:38:27 字數 2494 閱讀 4841

通常使用的有兩種資料型別:短型(兩個位元組)和長型(四個位元組)。

下面介紹的這些轉換函式對於這兩類的無符號整型變數都可以正確的轉換。 

如果你想將乙個短型資料從主機位元組順序轉換到網路位元組順序的話,有這樣乙個函式htnos:

它是以"h」開頭的,代表「主機」;

緊跟著它的是"to",代表「轉換到」;

然後是"n",代表「網路」;

最後是"s",代表「短型資料」。

你可以使用"n", "h", "to", "s", "l"的任意組合。當然,你要在可能的情況下進行組合。比如,系統是沒有stolh()函式的(short to long host ?)。

下面給出套接字位元組轉換程式的列表:

hotns()——"host to network short",主機位元組順序轉換為網路位元組順序(對無符號短型進行操作 4bytes)

htonl()——"host to network long",主機位元組順序轉換為網路位元組順序(對無符號長型進行操作 8bytes)

ntons()——"network to host short",網路位元組序轉換為主機位元組順序(對無符號短型進行操作 4bytes)

ntohl()——"network to host long",網路位元組順序轉換為主機位元組順序(對無符號長型進行操作 8bytes)

例如:*.sin_addr.s_addr = htonl(innaddr_any)是什麼意思?

*.sin_addr.s_addr = htonl(innaddr_any)是socket程式設計中用到的。

*是任意定義的乙個sockaddr_in型的結構體物件sin_addr是他的乙個屬性,用於定義ip位址,是strcut in_addr型的,s_addr為結構體in_addr的物件,簡單說就是三個結構體巢狀包裝的乙個包。

inaddr_any一般為核心指定的,大多數系統取0,表示任意的ip位址。

htonl()簡單說是把乙個本機ip轉化為網路協議中規定的格式的函式,也就是所謂的大端模式或小端模式。

htons函式是將乙個u_short型別的值從主機位元組順序轉換為tcp/ip的網路位元組順序,原型宣告如下:

u_short  htons(u_short  hostshort);

htonl函式是將乙個u_long的值從主機位元組順序轉換為tcp/ip的網路位元組順序,原型宣告如下:

u_long  htonl(u_long  hostlong);

位元組序和網路平台有關,不同的平台,位元組序不同。(位元組序顧名思義——位元組的排列順序)只有多於乙個位元組的資料型別,才有位元組序的問題,比如short或者int型別。char是沒有這個問題的。位元組序就是在硬體裡面,一般實在記憶體裡,如何表示儲存和表示這些資料型別。如果高位元組放到高位址上,就是大端(big endian),如果高位元組放到低位址上,就是小端模式(little endian)。

,不管主機位元組序是什麼,往網路上傳送前,都轉換成網路位元組序,也就是用htons或htonl;而從網路收到的資料,不管主機是什麼位元組序,都轉換成主機位元組序,也就是ntohs或者額ntohl。按照這個規則,一般來說,不會出什麼問題了。

舉個例子,乙個int型的整數在計算機中佔4個位元組,那麼就有兩種排列方法:

整數0x01020304的兩種表示方法

低位址----------------高位址

04      03      02      01---------------->方法1:小端模式(高位元組放到低位址上)

01      02      03      04---------------->方法2:大端模式(高位元組放到高位址上)  網路位元組序

其中,方法1和方法2的區別就是高位放到高低之還是低位址。

為了使得不同的主機格式能夠無歧義的和網路格式相互賦值,一般牽涉到網路的開發庫都會定義一套兩種格式之間的轉換函式,這樣直接使用轉換函式就可以完成兩者之間的轉換。

在進行tcp通訊時,需要進行主機位元組序和網路位元組的轉換。可如果我要傳送的資料是呼叫readfile()函式從檔案裡讀出來的,也就是讀出來的資料都是儲存到char陣列裡的,那我用send函式傳送時還需要轉換位元組序嗎?(http://topic.csdn.net/u/20091208/15/14925202-ce0d-4651-abfb-9e2f3cb73f1f.html)

——如果只是位元組流,不需要轉換。一般是ip位址,埠號碼,傳輸一些整型數的引數,才需要做轉換,位元組流不需要。如果頭部記錄了大小的,那麼這個記錄了大小的整型數需要轉換;

——協議解析方面的數字型別需要轉換,負載位元組流的不需要關心;

——需要讓網路認識的資料,才需要轉換,比如ip,埠號。而實際傳送的資料,是沒有轉換要求的。從檔案裡讀取出來的資料是你自己的資料吧,這些資料轉不轉換看你自己,反正發出去是什麼樣子,接收到就還是什麼樣子。

套接字中的資料轉換 大端模式 小端模式

通常使用的有兩種資料型別 短型 兩個位元組 和長型 四個位元組 下面介紹的這些轉換函式對於這兩類的無符號整型變數都可以正確的轉換。如果你想將乙個短型資料從主機位元組順序轉換到網路位元組順序的話,有這樣乙個函式htnos 它是以 h 開頭的,代表 主機 緊跟著它的是 to 代表 轉換到 然後是 n 代...

大端小端模式判斷以及資料轉換

計算機都是以八位乙個位元組為儲存單位,那麼乙個16位的整數,也就是c語言中的short,在記憶體中可能有兩種儲存順序big endian和litte endian.考慮乙個short整數0xaf32 0x32是低位,0xaf是高位 把它賦值給乙個short變數,那麼它在記憶體中的儲存可能有如下兩種情...

小端模式與大端模式的資料計算

最近在做一款物聯網軟體 需要將嵌入式裝置與安卓裝置進行資料對接 從嵌入式裝置中接收資料報 這個資料報的的幀長度使用小端模式進行計算 正好在這裡總結下 接收到的byte陣列 0x12 0x34 0x56 0x78 這個陣列存放的記憶體位址情況 陣列的前面在高位記憶體中 後面的在低位記憶體中 假設0x7...