理解字節(jié)序

1.計(jì)算機(jī)硬件有兩種儲(chǔ)存數(shù)據(jù)的方式:大端字節(jié)序(big endian)和小端字節(jié)序(little endian)

舉例來(lái)說(shuō),數(shù)值0x2211使用兩個(gè)字節(jié)儲(chǔ)存:高位字節(jié)是0x22,低位字節(jié)是0x11

  • 大端字節(jié)序:高位字節(jié)在前,低位字節(jié)在后,這是人類讀寫(xiě)數(shù)值的方法
  • 小端字節(jié)序:低位字節(jié)在前,高位字節(jié)在后,即以0x1122形式儲(chǔ)存

同理,0x1234567的大端字節(jié)序和小端字節(jié)序的寫(xiě)法如下圖

2.為什么會(huì)有小端字節(jié)序?

因?yàn)橛?jì)算機(jī)電路先處理低位字節(jié),效率比較高,因?yàn)橛?jì)算都是從低位開(kāi)始的,所以,計(jì)算機(jī)的內(nèi)部處理都是小端字節(jié)序.

但是,人類還是習(xí)慣讀寫(xiě)大端字節(jié)序。所以,除了計(jì)算機(jī)的內(nèi)部處理,其他的場(chǎng)合幾乎都是大端字節(jié)序,比如網(wǎng)絡(luò)傳輸和文件儲(chǔ)存。

計(jì)算機(jī)處理字節(jié)序的時(shí)候,不知道什么是高位字節(jié),什么是低位字節(jié)。它只知道按順序讀取字節(jié),先讀第一個(gè)字節(jié),再讀第二個(gè)字節(jié)。

如果是大端字節(jié)序,先讀到的就是高位字節(jié),后讀到的就是低位字節(jié)。小端字節(jié)序正好相反。

3.理解這一點(diǎn),才能理解計(jì)算機(jī)如何處理字節(jié)序?

處理字節(jié)序,遵循規(guī)則:

"只有讀取的時(shí)候,才必須區(qū)分字節(jié)序,其他情況都不用考慮。"

處理器讀取外部數(shù)據(jù)的時(shí)候,必須知道數(shù)據(jù)的字節(jié)序,將其轉(zhuǎn)成正確的值。然后,就正常使用這個(gè)值,完全不用再考慮字節(jié)序。

即使是向外部設(shè)備寫(xiě)入數(shù)據(jù),也不用考慮字節(jié)序,正常寫(xiě)入一個(gè)值即可。外部設(shè)備會(huì)自己處理字節(jié)序的問(wèn)題。

4.舉例來(lái)說(shuō),處理器讀入一個(gè)16位整數(shù)。如果是大端字節(jié)序,就按下面的方式轉(zhuǎn)成值。

x = buf[offset] * 256 + buf[offset+1];

上面代碼中,buf是整個(gè)數(shù)據(jù)塊在內(nèi)存中的起始地址,offset是當(dāng)前正在讀取的位置。第一個(gè)字節(jié)乘以256,再加上第二個(gè)字節(jié),就是大端字節(jié)序的值,這個(gè)式子可以用邏輯運(yùn)算符改寫(xiě)。

x = buf[offset]<<8 | buf[offset+1];

上面代碼中,第一個(gè)字節(jié)左移8位(即后面添8個(gè)0),然后再與第二個(gè)字節(jié)進(jìn)行或運(yùn)算。

如果是小端字節(jié)序,用下面的公式轉(zhuǎn)成值:

x = buf[offset+1] * 256 + buf[offset];

32位整數(shù)的求值公式也是一樣的:

/* 大端字節(jié)序 /
i = (data[3]<<0) | (data[2]<<8) | (data[1]<<16) | (data[0]<<24);
/
小端字節(jié)序 */
i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容