網路位元組碼 本地位元組碼(大端,小端)

2021-07-11 08:48:08 字數 2977 閱讀 8389

關於大端小端名詞的由來,有乙個有趣的故事,來自於jonathan swift的《格利佛遊記》:lilliput和blefuscu這兩個強國在過去的36個月中一直在苦戰。戰爭的原因:大家都知道,吃雞蛋的時候,原始 的方法是打破雞蛋較大的一端,可以那時的皇帝的祖父由於小時侯吃雞蛋,按這種方法把手指弄破了,因此他的父親,就下令,命令所有的子民吃雞蛋的時候,必須 先打破雞蛋較小的一端,違令者重罰。然後老百姓對此法令極為反感,期間發生了多次叛亂,其中乙個皇帝因此送命,另乙個丟了王位,產生叛亂的原因就是另乙個 國家blefuscu的國王大臣煽動起來的,叛亂平息後,就逃到這個帝國避難。據估計,先後幾次有11000餘人情願死也不肯去打破雞蛋較小的端吃雞蛋。 這個其實諷刺當時英國和法國之間持續的衝突。danny cohen一位網路協議的開創者,第一次使用這兩個術語指代位元組順序,後來就被大家廣泛接受。

big-endian和little-endian的定義如下:

1) little-endian就是低位位元組排放在記憶體的低位址端,高位位元組排放在記憶體的高位址端。

2) big-endian就是高位位元組排放在記憶體的低位址端,低位位元組排放在記憶體的高位址端。

舉乙個例子,比如數字0x12 34 56 78在記憶體中的表示形式為:

1)大端模式:

低位址 ——————> 高位址

0x78 | 0x56 | 0x34 | 0x12

可見,大端模式和字串的儲存模式類似。

記憶體位址

小端模式存放內容

大端模式存放內容

0x4000

0x34

0x12

0x4001

0x12

0x34

32bit寬的數0x12345678在little-endian模式以及big-endian模式)cpu記憶體中的存放方式(假設從位址0x4000開始存放)為:

記憶體位址

小端模式存放內容

大端模式存放內容

0x4000

0x78

0x4001

0x56

0x34

0x4002

0x34

0x56

0x4003

0x12

0x78

小端模式 :強制轉換資料不需要調整位元組內容,1、2、4位元組的儲存方式一樣。

大端模式 :符號位的判定固定為第乙個位元組,容易判斷正負。

這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但是程式語言中除了8bit的char之外,還有 16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數大於8位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於乙個位元組,那麼必然存在著乙個如果將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。例如乙個16bit的short型x,在記憶體中的位址為0x0010,x的值為0x1122,那麼0x11為高位元組,0x22為低位元組。對於大端模式,就將0x11放在低位址中,即0x0010 中,0x22放在高位址中,即0x0011中。小端模式,剛好相反。

可以編寫乙個小的測試程式來判斷機器的位元組序:

bool isbigendian()  

return false;

}

bool isbigendian()  

num;

num.a = 0x1234;

if( num.b == 0x12 )

return false;

}

常見的位元組序 一般作業系統都是小端,而通訊協議是大端的。

常見cpu的位元組序 big endian : powerpc、ibm、sun

little endian : x86、dec

arm既可以工作在大端模式,也可以工作在小端模式。

在進行網路通訊時是否需要進行位元組序轉換?

相同位元組序的平台在進行網路通訊時可以不進行位元組序轉換,但是跨平台進行網路資料通訊時必須進行位元組序轉換。

原因如下:網路協議規定接收到得第乙個位元組是高位元組,存放到低位址,所以傳送時會首先去低位址取資料的高位元組。小端模式的多位元組資料在存放時,低位址存放的是低位元組,而被傳送方網路協議函式傳送時會首先去低位址取資料(想要取高位元組,真正取得是低位元組),接收方網路協議函式接收時會將接收到的第乙個位元組存放到低位址(想要接收高位元組,真正接收的是低位元組),所以最後雙方都正確的收發了資料。而相同平台進行通訊時,如果雙方都進行轉換最後雖然能夠正確收發資料,但是所做的轉換是沒有意義的,造成資源的浪費。而不同平台進行通訊時必須進行轉換,不轉換會造成錯誤的收發資料,位元組序轉換函式會根據當前平台的儲存模式做出相應正確的轉換,如果當前平台是大端,則直接返回不進行轉換,如果當前平台是小端,會將接收到得網路位元組序進行轉換。

網路位元組序

網路上傳輸的資料都是位元組流,對於乙個多位元組數值,在進行網路傳輸的時候,先傳遞哪個位元組?也就是說,當接收端收到第乙個位元組的時候,它將這個位元組作為高位位元組還是低位位元組處理,是乙個比較有意義的問題; udp/tcp/ip協議規定:把接收到的第乙個位元組當作高位位元組看待,這就要求傳送端傳送的第乙個位元組是高位位元組;而在傳送端傳送資料時,傳送的第乙個位元組是該數值在記憶體中的起始位址處對應的那個位元組,也就是說,該數值在記憶體中的起始位址處對應的那個位元組就是要傳送的第乙個高位位元組(即:高位位元組存放在低位址處);由此可見,多位元組數值在傳送之前,在記憶體中因該是以大端法存放的; 所以說,網路位元組序是大端位元組序

powerpc處理器提供了lwbrx,lhbrx,stwbrx,sthbrx四條指令用於處理位元組序的轉換以優化__swab16和__swap32 這類函式。此外powerpc處理器中的rlwimi指令也可以用來實現__swab16和__swap32這類函式。

在對普通檔案進行處理也需要考慮端模式問題。在大端模式的處理器下對檔案的32,16位讀寫操作所得到的結果與小端模式的處理器不同。單純從軟體的角度 理解上遠遠不能真正理解大小端模式的區別。事實上,真正的理解大小端模式的區別,必須要從系統的角度,從指令集,暫存器和資料匯流排上深入理解,大小端模式 的區別。

從系統的角度理解端模式

網路位元組序 大端 小端

1.小端法 little endian 就是低位位元組排放在記憶體的低位址端 即該值的起始位址 高位位元組排放在記憶體的高位址端 2.大端法 big endian 就是高位位元組排放在記憶體的低位址端 即該值的起始位址 低位位元組排放在記憶體的高位址端 網路上傳輸的資料都是位元組流,對於乙個多位元組...

大端 小端 網路位元組序

2010 10 10 17 44 58 分類 c vc c 舉報 字型大小訂閱 一 大端 小端 大端 和 小端 表示多位元組值的哪一端儲存在該值的起始位址處 小端儲存在起始位址處,即是小端位元組序 大端儲存在起始位址處,即是大端位元組序 或者說 1.小端法 little endian 就是低位位元組...

大端 小端 網路位元組序

網路位元組序 network byte order 一般是指大端 big endian,對大部分網路傳輸協議而言 傳輸,大端小端的概念是面向多位元組資料型別的儲存方式定義的,小端就是低位在前,大端就是高位在前,其中 前 是指靠近記憶體低位址,儲存在硬碟上就是先寫那個位元組 1 首先大小端是面向多位元...