日期: 2023年11月22日 1.
計算機硬體有兩種儲存資料的方式:大端位元組序(big endian)和小端位元組序(little endian)。
舉例來說,數值0x2211
使用兩個位元組儲存:高位位元組是0x22
,低位位元組是0x11
。
同理,0x1234567
的大端位元組序和小端位元組序的寫法如下圖。
2.我一直不理解,為什麼要有位元組序,每次讀寫都要區分,多麻煩!統一使用大端位元組序,不是更方便嗎?
上週,我讀到了一篇文章,解答了所有的疑問。而且,我發現原來的理解是錯的,位元組序其實很簡單。
3.首先,為什麼會有小端位元組序?
答案是,計算機電路先處理低位位元組,效率比較高,因為計算都是從低位開始的。所以,計算機的內部處理都是小端位元組序。
但是,人類還是習慣讀寫大端位元組序。所以,除了計算機的內部處理,其他的場合幾乎都是大端位元組序,比如網路傳輸和檔案儲存。
4.計算機處理位元組序的時候,不知道什麼是高位位元組,什麼是低位位元組。它只知道按順序讀取位元組,先讀第乙個位元組,再讀第二個位元組。
如果是大端位元組序,先讀到的就是高位位元組,後讀到的就是低位位元組。小端位元組序正好相反。
理解這一點,才能理解計算機如何處理位元組序。
5.位元組序的處理,就是一句話:
"只有讀取的時候,才必須區分位元組序,其他情況都不用考慮。"處理器讀取外部資料的時候,必須知道資料的位元組序,將其轉成正確的值。然後,就正常使用這個值,完全不用再考慮位元組序。
即使是向外部裝置寫入資料,也不用考慮位元組序,正常寫入乙個值即可。外部裝置會自己處理位元組序的問題。
6.舉例來說,處理器讀入乙個16位整數。如果是大端位元組序,就按下面的方式轉成值。
上面**中,x = buf[offset]
*256
+ buf[offset+1]
;
buf
是整個資料塊在記憶體中的起始位址,offset
是當前正在讀取的位置。第乙個位元組乘以256,再加上第二個位元組,就是大端位元組序的值,這個式子可以用邏輯運算子改寫。
上面**中,第乙個位元組左移8位(即後面添8個x = buf[offset]
<
<
8| buf[offset+1]
;
0
),然後再與第二個位元組進行或運算。
如果是小端位元組序,用下面的公式轉成值。
32位整數的求值公式也是一樣的。x = buf[offset+1]
*256
+ buf[offset]
;
(完)/* 大端位元組序 */
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)
;
理解位元組序
在學習python測試指令碼的時候,碰到乙個struct.pack fmt,v1,v2,是關於位元組序轉換的,順便了解了一下位元組序。首先介紹一下 struct.pack struct.apck用於將python的值根據格式符,轉換為字串 因為python中沒有位元組 byte 型別,這裡的字串可理...
理解位元組序
1.計算機硬體有兩種儲存資料的方式 大端位元組序 big endian 和小端位元組序 little endian 舉例來說,數值0x2211使用兩個位元組儲存 高位位元組是0x22,低位位元組是0x11。同理,0x1234567的大端位元組序和小端位元組序的寫法如下圖。2.我一直不理解,為什麼要有...
理解位元組序
計算機硬體有兩種儲存資料的方式 大端位元組序 big endian 和小端位元組序 little endian 舉例來說,數值0x2211使用兩個位元組儲存 高位位元組是0x22,低位位元組是0x11。大端位元組序 高位位元組在前,低位位元組在後,這是人類讀寫數值的方法。小端位元組序 低位位元組在前...