關(guān)于字節(jié)序、比特序,相信已經(jīng)有很多文章來解釋這個事情,本文試圖從不同的視角解釋這件事情,包括人類閱讀者、計算機硬件、C語言開發(fā)者、TCP/IP網(wǎng)絡(luò)、JAVA開發(fā)者、編解碼開發(fā)者。
一、背景
這里再描述一下大端、小端字節(jié)序,如下圖示:
大端:存儲值的高位在低地址,存儲值的低位在高地址。比如0x01是該數(shù)字的最高字節(jié),但卻是存儲在0x100,最低的地址;0x67是該數(shù)字的最小值的字節(jié),存儲在0x103這個最高地址。
小端:存儲值的高位在高地址,存儲值的低位在低地址。
備注:地址的增長方向默認與人類閱讀方向一致,在圖中均為從左向右逐漸增大。
比特序和當前機器的字節(jié)序保持一致,如果字節(jié)序為大端,則比特序也是大端。

二、人類閱讀者視角
人類閱讀時,從左向右進行閱讀,所以先看到數(shù)字的高位,最后才能看到數(shù)字的低位。所以,人類的閱讀順序,天然是大端順序。
比如10進制數(shù)字1022,轉(zhuǎn)換為二進制是0x03FE,即
1022 = 3 * 16 * 16 + F * 16 + E =?3 * 16 * 16 + 15 * 16 + 14
0x03FE這種表述方式,就是大端順序,因為0x03作為高位,卻在低地址的一側(cè)。
所以,大端順序是更方便人類閱讀和表述的順序。
三、計算機硬件視角
如上圖所示,計算機硬件視角下,字節(jié)序由硬件決定,目前是:
x86 處理器為小端字節(jié)序;
部分Power等處理器為大端字節(jié)序;
ARM、部分Power處理器字節(jié)序可配置。
四、C語言開發(fā)者視角
因為C語言是非常底層的語言,會直接把內(nèi)存的實際字節(jié)排列返回給開發(fā)者,所以開發(fā)者需要根據(jù)判斷硬件的字節(jié)序,進行特定的處理
四、TCP/IP網(wǎng)絡(luò)視角
TCP/IP網(wǎng)絡(luò)的2端,可能會連接不同的硬件,比如客戶端是小端字節(jié)序,服務(wù)端是大端字節(jié)序,這時如果字節(jié)序不統(tǒng)一,則無法進行通信。所以,TCP/IP網(wǎng)絡(luò)中的比特序是固定的。
TCP/IP網(wǎng)絡(luò)中統(tǒng)一為大端字節(jié)序,但比特序為小端比特序。
其中,字節(jié)序的轉(zhuǎn)換,依賴不同的語言,可能需要由開發(fā)者去轉(zhuǎn)換,比如C語言中,在發(fā)送和接收網(wǎng)絡(luò)數(shù)據(jù)時需要調(diào)用htonl等函數(shù)進行字節(jié)序轉(zhuǎn)換。但JAVA語言不需要轉(zhuǎn)換。
比特序的轉(zhuǎn)換,則是由網(wǎng)卡完成的。
五、JAVA開發(fā)者視角
JAVA對字節(jié)序也進行了簡化,開發(fā)者看到的,統(tǒng)一為大端字節(jié)序。所以JAVA開發(fā)者輕松很多,只需要按人類正常閱讀的方式,處理字節(jié)序就可以了
六、編解碼開發(fā)者視角
對于編解碼的開發(fā)者,是直接接觸字節(jié)序和位序的使用者。
比如字段A,在編碼協(xié)議中,定義為int10,即類型為int,長度為10個bit。如果協(xié)議中對某些字段未明確指定字節(jié)序,則一般為大端字節(jié)序,因為最符合人類的閱讀方式。
比如數(shù)字300,類型為int10,16進制表示為0x12C,即0x01和0x2C。則編碼時,
1.寫入0x01,占用2位
2.寫入0x2C,占用8位
真實的存儲排布為0x012C
參考文章:
1.https://blog.csdn.net/frank_jb/article/details/79027711
2.https://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82%E5%BA%8F
3.https://en.wikipedia.org/wiki/Endianness#Endianness_in_networking