網路程式設計之位元組序對跨平台資料傳輸的影響

2021-08-03 05:16:34 字數 2227 閱讀 5608

** 

關於位元組序對跨平台資料傳輸的作用。我分下面幾個方面整理了下,知識點應當算比較全了。

一。從服務端傳送整數到客戶端為例,看看位元組序的應用。

二。什麼是位元組序?

三。什麼是網路位元組序

四。如何確定本機的大小端

一。從服務端傳送整數到客戶端為例,看看位元組序的應用。 

服務端**節選:

//傳送整數

//呼叫 send_num(sclient,num,sizeof(int));

voidsend_num(intsockfd,int*data,intnbytes)

客戶端**節選:

//接收整數

voidrecv_num(intsockfd,int*data)

上面**可以放入我前面的socket例子中測試下。

注意,字串型的無須轉換,整型的則需要。 原因之一是網路傳輸是以位元組為單位進行的。由sizeof(char)可知,乙個字元對應乙個位元組,

無須轉換, 但sizeof(int)會發現佔四位,說明儲存乙個整型需要佔4個位元組。這時需要將其從本地位元組序轉為網路位元組序才能正確的傳輸。

二。什麼是位元組序?

不同的計算機系統採用不同的位元組序儲存資料,同樣乙個4位元組的32位整數,在記憶體中儲存的方式就不同. 位元組序分為小尾位元組序(little endian)和大尾位元組序(big endian), intel處理器大多數使用小尾位元組序, motorola處理器大多數使用大尾(big endian)位元組序;

小尾就是低位位元組排放在記憶體的低端,高位位元組排放在記憶體的高階。

大尾就是高位位元組排放在記憶體的低端,低位位元組排放在記憶體的高階。

可以用printf("%02x,%02x,%02x,%02x",p,p+1,p+2,p+3);類似的方式列印出來做對比。

三。什麼是網路位元組序

tcp/ip各層協議將位元組序定義為大尾,因此tcp/ip協議中使用的位元組序通常稱之為網路位元組序。

這意味著,在資料流傳輸過程中,本地資料流需轉為網路位元組序傳輸, 然後網路資料流再轉換成本地位元組序資料流。

所以c語言提供了一堆轉換函式:

htons(): 將16位無符號整數從本地位元組序轉換成網路位元組序

htonl(): 將32位無符號整數從本地位元組序轉換成網路位元組序

ntohs(): 將16位無符號整數從網路位元組序轉換成本地位元組序

ntohl(): 將32位無符號整數從網路位元組序轉換成本地位元組序

不過沒有針對64位整型的轉換函式,而這個還是常用到的。

轉乙個64位位元組序轉換函式( 找的):

unsignedlonglong ntohll(unsigned longlong val)

elseif (__byte_order == __big_endian)

} unsignedlonglong htonll(unsigned longlong val)

elseif (__byte_order == __big_endian)

}

四。如何確定本機的大小端

這個網上一大堆,下面找的兩種方法展示得很清楚:

第一種方法:

思路:利用指標的強制型別轉換

#include intmain(void)

return0;

}

第二種方法

思路:利用共用體所有資料都從同一位址開始儲存這個特性來區分。

#include intmain(void)

test;

test.data = 0x12345678;

if(test.ch == 0x78)

else

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

return0;

}

執行上面任意一種方法,都能很清楚的展示出位元組的順序來出。

網路程式設計之位元組序

關於位元組序的問題,查了一些資料 1.大小端 2.網路位元組序 3.大小端與網路位元組序 4.socket與位元組序 上述資料裡有相關概念和知識點的說明,以下會對部分問題做幾點總結。這裡以主機位元組序作說明,計算機在儲存多位元組資料時,例如c語言中的整型資料 int 無法用乙個位元組單元的記憶體將資...

TCP IP網路程式設計之位元組序和網路位元組序

一 概要 二 簡介 在此之前我們需要了解清楚幾個概念。cpu架構 人們常說的x86 x64是一種架構,但是他有32位的和64位的。32位的叫x86 後來出現基於它的64位版,就叫x64。作業系統位數 64位的系統是基於64位處理器而來的,所以64位的系統能在64位的處理器上執行,但是不能在32的處理...

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

0 為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為 8bit。但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型,另外,對於位數大於 8位的處理器,例如16位或者32位的處理器,由於...