小端格式和大端格式(Little-EndianBig-Endian)
小端格式和大端格式(Little-Endian&Big-Endian)
1 字節(jié)序
字節(jié)序,也就是字節(jié)的順序,指的是多字節(jié)的數(shù)據(jù)在內(nèi)存中的存放順序。
在幾乎所有的機(jī)器上,多字節(jié)對象都被存儲為連續(xù)的字節(jié)序列。
例如:如果C/C++中的一個int型變量 a 的起始地址是&a = 0x100,那么 a 的四個字節(jié)將被存儲在存儲器的0x100, 0x101, 0x102, 0x103位置。
不同的CPU有不同的字節(jié)序類型,最常見的有兩種:
-
Little-Endian:將低序字節(jié)存儲在起始地址(低位編址)
-
Big-Endian:將高序字節(jié)存儲在起始地址(高位編址)
舉例說明如下圖
然后就牽涉出兩大CPU派系:
- Motorola 6800,PowerPC 970,SPARC(除V9外)等處理器采用Big-Endian方式存儲數(shù)據(jù);
- x86系列,VAX,PDP-11等處理器采用Little0Endian方式存儲數(shù)據(jù)。
- 另外,還有一些處理器像ARM, DEC Alpha的字節(jié)序是可配置的。
2 LE(Little-Endian)
最符合人的思維的字節(jié)序
地址低位存儲值的低位,地址高位存儲值的高位。
因為從人的第一觀感來說,低位值小,就應(yīng)該放在內(nèi)存地址小的地方,也即內(nèi)存地址低位。反之,高位值就應(yīng)該放在內(nèi)存地址大的地方,也即內(nèi)存地址高位。所以說是最符合人的思維的字節(jié)序。
就好比我們從小學(xué)的計數(shù)法,個位代表的單位值最小,放在最低位,以此類推十位,百位。
優(yōu)勢:長度為1,2,4字節(jié)的數(shù),排列方式都是一樣的,數(shù)據(jù)類型轉(zhuǎn)換非常方便。
舉個例子:在內(nèi)存中雙字0x01020304(DWORD)和0x1234abcd的存儲方式。
| LE | 04 | 03 | 02 | 01 |
| LE | 0xcd | 0xab | 0x34 | 0x12 |
注:每個地址存1個字節(jié),每個字有4個字節(jié)。2位16進(jìn)制數(shù)是1個字節(jié)(0xFF=11111111)。
3 BE(Big-Endian)
最直觀的字節(jié)序
地址低位存儲值的高位,地址高位存儲值的低位,
只需要把內(nèi)存地址從左到右按照由低到高的順序?qū)懗?#xff0c;也就是把值按照通常的高位到低位的順序?qū)懗?#xff0c;一個字節(jié)一個字節(jié)的填充進(jìn)去即可,直接閱讀從低到高的地址里面的數(shù)據(jù)即可。
舉個例子:在內(nèi)存中雙字0x01020304(DWORD)和0x1234abcd的存儲方式。
| BE | 0x01 | 0x02 | 0x03 | 0x04 |
| BE | 0x12 | 0x23 | 0xab | 0xcd |
注:每個地址存1個字節(jié),每個字有4個字節(jié)。2位16進(jìn)制數(shù)是1個字節(jié)(0xFF=11111111)。
4 為什么要注意字節(jié)序
如果你寫的程序只在單機(jī)環(huán)境下面運(yùn)行,并且不和別人的程序打交道,那么你完全可以忽略字節(jié)序的存在。
但是,如果你的程序要跟別人的程序產(chǎn)生交互呢? 比如,當(dāng)一個 C/C++ 的程序要與一個 Java 程序交互時:
- C/C++語言編寫的程序里數(shù)據(jù)存儲順序是跟編譯平臺所在的CPU相關(guān)的,而現(xiàn)在比較普遍的 x86 處理器是 Little Endian
- JAVA編寫的程序則唯一采用 Big Endian 方式來存儲數(shù)據(jù)
試想,如果你的C/C++程序?qū)⒆兞?a = 0x12345678 的首地址傳遞給了Java程序,由于Java采取 Big Endian 方式存儲數(shù)據(jù),很自然的它會將你的數(shù)據(jù)翻譯為 0x78563412。顯然,問題就出現(xiàn)了!!!
另外,網(wǎng)絡(luò)傳輸一般采用 Big Endian,也被稱之為網(wǎng)絡(luò)字節(jié)序,或網(wǎng)絡(luò)序。當(dāng)兩臺采用不同字節(jié)序的主機(jī)通信時,在發(fā)送數(shù)據(jù)之前都必須經(jīng)過字節(jié)序的轉(zhuǎn)換成為網(wǎng)絡(luò)字節(jié)序后再進(jìn)行傳輸。
5 判斷機(jī)器的字節(jié)序
由于 C/C++ 存儲數(shù)據(jù)時的字節(jié)序依賴所在平臺的CPU,所以我們可以通過C/C++程序判定機(jī)器的端序:
void Endianness() {int a = 0x12345678;if( *((char*)&a) == 0x12)cout << "Big Endian" << endl;elsecout << "Little Endian" << endl; }參考文獻(xiàn)
小端格式和大端格式(Little-Endian&Big-Endian) - 清風(fēng)行云 - 博客園
字節(jié)序:Big Endian 和 Little Endian | 神奕的博客
總結(jié)
以上是生活随笔為你收集整理的小端格式和大端格式(Little-EndianBig-Endian)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JSON格式转换成XML格式
- 下一篇: Abaqus液体中气液两相的气泡仿真