http://www.ruanyifeng.com/blog/2016/11/byte-order.html
1.
計算機硬體有兩種儲存資料的方式:大端位元組序(big endian)和小端位元組序(little endian),
舉例來說,數值0x2211使用兩個位元組儲存:高位位元組是0x22,低位位元組是0x11,
- 大端位元組序:高位位元組在前,低位位元組在后,這是人類讀寫數值的方法,
- 小端位元組序:低位位元組在前,高位位元組在后,即以
0x1122形式儲存,

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

2.
我一直不理解,為什么要有位元組序,每次讀寫都要區分,多麻煩!統一使用大端位元組序,不是更方便嗎?
上周,我讀到了一篇文章,解答了所有的疑問,而且,我發現原來的理解是錯的,位元組序其實很簡單,
3.
首先,為什么會有小端位元組序?
答案是,計算機電路先處理低位位元組,效率比較高,因為計算都是從低位開始的,所以,計算機的內部處理都是小端位元組序,
但是,人類還是習慣讀寫大端位元組序,所以,除了計算機的內部處理,其他的場合幾乎都是大端位元組序,比如網路傳輸和檔案儲存,
4.
計算機處理位元組序的時候,不知道什么是高位位元組,什么是低位位元組,它只知道按順序讀取位元組,先讀第一個位元組,再讀第二個位元組,
如果是大端位元組序,先讀到的就是高位位元組,后讀到的就是低位位元組,小端位元組序正好相反,
理解這一點,才能理解計算機如何處理位元組序,
5.
位元組序的處理,就是一句話:
"只有讀取的時候,才必須區分位元組序,其他情況都不用考慮,"
處理器讀取外部資料的時候,必須知道資料的位元組序,將其轉成正確的值,然后,就正常使用這個值,完全不用再考慮位元組序,
即使是向外部設備寫入資料,也不用考慮位元組序,正常寫入一個值即可,外部設備會自己處理位元組序的問題,
6.
舉例來說,處理器讀入一個16位整數,如果是大端位元組序,就按下面的方式轉成值,
x = buf[offset] * 256 + buf[offset+1];
上面代碼中,buf是整個資料塊在記憶體中的起始地址,offset是當前正在讀取的位置,第一個位元組乘以256,再加上第二個位元組,就是大端位元組序的值,這個式子可以用邏輯運算子改寫,
x = buf[offset]<<8 | buf[offset+1];
上面代碼中,第一個位元組左移8位(即后面添8個0),然后再與第二個位元組進行或運算,
如果是小端位元組序,用下面的公式轉成值,
x = buf[offset+1] * 256 + buf[offset];
32位整數的求值公式也是一樣的,
/* 大端位元組序 */ i = (data[3]<<0) | (data[2]<<8) | (data[1]<<16) | (data[0]<<24); /* 小端位元組序 */ i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/233765.html
標籤:其他
