【編碼】位元組順序 Big Endian 與 Little Endian。BOM FFFE 、FEFF 怎麼記?

重要程度的順序

假設我手上有 1234 元。

地球人的寫法是 1234元,
火星人的寫法卻是 4321元。




這兩種寫法代表的金額都相同,

只是差別在於 地球人將重要的位數寫在前面
而 火星人則將重要的位數寫在後面


什麼是重要的位數

重要位元:最高有效位元 MSB (Most Significant Bit)
不重要位元:最低有效位元 LSB (Least Significant Bit)

以地球人角度而言,重要的是 1234元 前面的1、還是尾巴的4?
前面的1代表1000元,後面的4就只是4元。
少了1就差1000元。

所以1很重要,4很不重要。




位元組順序(Endianness)

剛剛的例子是以10進位的角度來看,一個數字就是一個單位(字元)。
現在則切換成位元組的方式(16進位),每兩個數字才是一個單位(字元)。

高位在前、高位在後?
高位在高、高位在低?

Big Endian
大端序(大尾序),重要的數寫(高位)寫在前(記憶體位址低位)。
MSB在前,LSB在後。
地球人
人類直覺的方式

Little Endian
小端序(小尾序),重要的數寫(高位)寫在後(記憶體位址高位)。
LSB在前,MSB在後。
火星人
電腦結構由低位開始計算效率較高




網路傳輸、通訊協議以及硬體架構上都會有位元組順序的問題,
到底先接重要的位元、還是先接不重要的位元?

JVM、TCP/IP協議 使用Big Endian
Intel x86、x64架構所使用Little Endian





位元組順序記號 (BOM: byte-order-mark)

BOM是用來標示Unicode的位元組順序,
BOM 通常會出現在文件或檔案的第一個字元,以告訴你接下來編碼是什麼、要怎麼解讀,左到右還是右到左。

其中的 UTF-8 只有一個單位,不存在位元組順序問題,
於是UTF-8的BOM記號可以出現也可以省略。

UTF-8: EF BB BF

UTF-16 Big Endian: FE FF
UTF-16 Little Endian: FF FE

UTF-32 Big Endian: 00 00 FE FF
UTF-32 Little Endian: FF FE 00 00



FE FF、FF FE 要怎麼記阿?每次都會搞混。


可以把FF想成最不重要的位元(LSB),
依序遞增...,
FE次重要,00是最重要的位元(MSB)




沒有留言:

張貼留言