簡介
在幾乎所有的機(jī)器上,多字節(jié)對象都被存儲為連續(xù)的字節(jié)序列。例如在C語言中,一個類型為int的變量x地址為0x100,那么其對應(yīng)地址表達(dá)式&x的值為0x100。且x的四個字節(jié)將被存儲在存儲器的0x100, 0x101, 0x102, 0x103位置。[1]
而存儲地址內(nèi)的排列則有兩個通用規(guī)則。一個多位的整數(shù)將按照其存儲地址的最低或最高字節(jié)排列。如果最低有效位在最高有效位的前面,則稱小端序;反之則稱大端序。在網(wǎng)絡(luò)應(yīng)用中,字節(jié)序是一個必須被考慮的因素,因為不同機(jī)器類型可能采用不同標(biāo)準(zhǔn)的字節(jié)序,所以均按照網(wǎng)絡(luò)標(biāo)準(zhǔn)轉(zhuǎn)化。
例如假設(shè)上述變量x類型為int,位于地址0x100處,它的十六進(jìn)制為0x01234567,地址范圍為0x100~0x103字節(jié),其內(nèi)部排列順序依賴于機(jī)器的類型。大端法從首位開始將是:0x100: 01, 0x101: 23,..。而小端法將是:0x100: 67, 0x101: 45,..。
字節(jié)順序
對于單一的字節(jié)(a byte),大部分處理器以相同的順序處理位元(bit),因此單字節(jié)的存放方法和傳輸方式一般相同。
對于多字節(jié)數(shù)據(jù),如整數(shù)(32位機(jī)中一般占4字節(jié)),在不同的處理器的存放方式主要有兩種,以內(nèi)存中0x0A0B0C0D的存放方式為例,分別有以下幾種方式:
大端序
- 數(shù)據(jù)以8bit為單位:
示例中,最高位字節(jié)是0x0A 存儲在最低的內(nèi)存地址處。下一個字節(jié)0x0B存在后面的地址處。正類似于十六進(jìn)制字節(jié)從左到右的閱讀順序。
- 數(shù)據(jù)以16bit為單位:
最高的16bit單元0x0A0B存儲在低位。
小端序
- 數(shù)據(jù)以8bit為單位:
最低位字節(jié)是0x0D 存儲在最低的內(nèi)存地址處。后面字節(jié)依次存在后面的地址處。
- 數(shù)據(jù)以16bit為單位:
最低的16bit單元0x0D0C存儲在低位。
- 更改地址的增長方向:
當(dāng)更改地址的增長方向,使之由右至左時,表格更具有可閱讀性。
最低有效位(LSB)是0x0D 存儲在最低的內(nèi)存地址處。后面字節(jié)依次存在后面的地址處。
最低的16bit單元0x0C0D存儲在低位。
總結(jié)
- 大端:高字節(jié)存放在低地址
- 小端:低字節(jié)存放在低地址