當前位置:
首頁 > 知識 > 理解位元組序

理解位元組序

來自: 阮一峰的網路日誌


1、計算機硬體有兩種儲存數據的方式:大端位元組序(big endian)和小端位元組序(little endian)。


舉例來說,數值0x2211使用兩個位元組儲存:高位位元組是0x22,低位位元組是0x11。

大端位元組序:高位位元組在前,低位位元組在後,這是人類讀寫數值的方法。


小端位元組序:低位位元組在前,高位位元組在後,即以0x1122形式儲存。

理解位元組序


同理,0x1234567的大端位元組序和小端位元組序的寫法如下圖。

理解位元組序



2、我一直不理解,為什麼要有位元組序,每次讀寫都要區分,多麻煩!統一使用大端位元組序,不是更方便嗎?


上周,我讀到了一篇文章,解答了所有的疑問。而且,我發現原來的理解是錯的,位元組序其實很簡單。

3、首先,為什麼會有小端位元組序?


答案是,計算機電路先處理低位位元組,效率比較高,因為計算都是從低位開始的。所以,計算機的內部處理都是小端位元組序。


但是,人類還是習慣讀寫大端位元組序。所以,除了計算機的內部處理,其他的場合幾乎都是大端位元組序,比如網路傳輸和文件儲存。


4、計算機處理位元組序的時候,不知道什麼是高位位元組,什麼是低位位元組。它只知道按順序讀取位元組,先讀第一個位元組,再讀第二個位元組。


如果是大端位元組序,先讀到的就是高位位元組,後讀到的就是低位位元組。小端位元組序正好相反。

理解這一點,才能理解計算機如何處理位元組序。


5、位元組序的處理,就是一句話:


"只有讀取的時候,才必須區分位元組序,其他情況都不用考慮。"


處理器讀取外部數據的時候,必須知道數據的位元組序,將其轉成正確的值。然

後,就正常使用這個值,完全不用再考慮位元組序。


即使是向外部設備寫入數據,也不用考慮位元組序,正常寫入一個值即可。外部設備會自己處理位元組序的問題。


6、舉例來說,處理器讀入一個16位整數。如果是大端位元組序,就按下面的方式轉成值。


上面代碼中,buf是整個數據塊在內存中的起始地址,offset是當前正在讀取的位置。第一個位元組乘以256,再加上第二個位元組,就是大端位元組序的值,這個式子可以用邏輯運算符改寫。


上面代碼中,第一個位元組左移8位(即後面添8個0),然後再與第二個位元組進行或運算。


如果是小端位元組序,用下面的公式轉成值。


32位整數的求值公式也是一樣的。


本文編號2309,以後想閱讀這篇文章直接輸入2309即可。


輸入m可以獲取到文章目錄


更多推薦15個技術類公眾微信


涵蓋:程序人生、演算法與數據結構、黑客技術與網路安全、大數據技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序猿 的精彩文章:

這多年來我一直在鑽研的技術
程序猿技能表:Java、C/C+、Android、iOS、PHP、前端……
學會編程,而不是學會Java
試試Linux下的ip命令,ifconfig已經過時了
這本演算法書寫了七年

TAG:程序猿 |

您可能感興趣

榴槤完整基因組序列公布
榴槤為什麼如此「重口味」?科學家公布其完整基因組序列
人類基因組序列與健康數據的緊密聯繫將帶給臨床醫學巨大改變
新行政區呼之欲出?新版北京總規或拉開全城重組序幕
「中國神電」揭開電企重組序幕,國改進入亮劍時間
【活動】後彎、前屈、開髖都有!不來挑戰一下這組序列嗎?