最近有接觸通訊協議有碰到字節序,記得上學的時候有說過不過太久了不怎么記得了,現在我在這里說說字節序;
我們都知道計算機存儲數據的時候都是把數據轉換成字節進行存儲,而日常我們的程序或存儲的數據通常都是由多個字節組成的,而不同的計算機或設備存儲的規則又不一致,導致我們在多計算機、設備間傳輸數據時就要了解設備的字節存儲(字節序)規則是怎樣的,這就是我們要了解字節序的原因,在做網絡編程,游戲編程時這是必須清楚的知識;
比如:在我們使用的計算機編程語言中就有各種數據類型:byte,int,short,long等等
而a byte由八個bit組成,一個short由兩個字節組成,一個int由四個字節組成等,而我們對byte、short、int等這些數據進行存儲或通過網絡傳輸時需要把他轉換為byte進行存儲或傳輸,這時把一個int轉為byte數組時的數據存儲順序就成為:字節順序。
例如: int 類型數據 :33818120,對應的十六進制為:0x02040608
轉成byte數組后byte數據為:byte[4]= {02,04,06,08}
byte數組中的數據的順序就稱為:字節順序
為什么在存儲或網絡編程的時候要關注字節順序呢?在網絡編程中比如我們發送的數據為:byte[4]= {02,04,06,08}而接收端不清楚我們的字節順序而使用與我們相反的字節順序接收數據:byte[4]= {08,06,04,02}這就導致接收端收到的數據變成了錯誤無效的數據,我們發送的數據為:33818120,而現在由于他不知道我們的字節順序導致接收到的數據為:134611970;
在英文上這個詞為endian,有翻譯為端序、字節序等等,我這里稱為【字節序】,據說endian這個詞的由來源自18世紀的一本小說《格列佛游記》,小說中:“吃雞蛋時是從雞蛋較大的一端打破雞蛋還是從雞蛋較小的一端打”,還以為這事有了叛亂;1980年一個網絡協議的開發者在其著名的論文《On Holy Wars and a Plea for Peace》中首次使用了該詞。
從字面上理解字節序為:字節存儲順序,上面我們也說過實際上字節序就是程序對象、數據存儲在計算機上的順序,一般字節序分為:小字節序(Little-Endian)、大字節序(Big-Endian)、混合字節序(Mixed-Endian)三種,混合字節序用得比較少,TCP/ip各層協議使用的是大字節序(Big-Endian)我們也稱為網絡字節序;
有塊地址空間四個字節長度如下:

例如:十進制數 33818120 十六進制為:0x02040608
在地址空間中以大字節序、小字節序存儲為如下格式:
大字節序(Little-Endian)在地址空間中存儲格式:
小字節序(Big-Endian)在地址空間中存儲格式:

大字節序:數據的高位存儲在地址空間的低位,數據的低位存儲在地址空間高位
小字節序:數據的低位存儲在地址空間的低位,數據的高位存儲在地址空間高位
在java中使用的是大字節序(Big-Endian)存儲數據,而C/C++存儲則與CPU相關,所以在網絡編程中一端為java開發的程序,一端為C/C++中的程序在傳輸的時候需要對傳輸的數據字節序(Endian)進行統一,都是用小字節序(Little-Endian)或大字節序(Big-Endian),否則一端接收到的數據將有可能為無效數據。
文章首發地址:Solinxhttp://www.solinx.co/archives/164
新聞熱點
疑難解答