1 位元組序由於不同的電腦系統採用不同的位元組序儲存資料,同樣一個4位元組的32位整數,在記憶體中儲存的方式就不同. 位元組序分為小尾位元組序(Little Endian)和大尾位元組序(Big Endian), Intel處理器大多數使用小尾位元組序, Motorola處理器大多數使用大尾(Big Endian)位元組序;小尾就是低位位元組排放在記憶體的低端,高位位元組排放在記憶體的高端。例如一個4位元組的值為0x1234567的整數與高低位元組對應關係:
| 01 |
23 |
45 |
67 |
| Byte3 |
Byte2 |
Byte1 |
Byte0 |
| 高位位元組--à---------à--------------à低位位元組 |
將在記憶體中按照如下順序排放:
| 記憶體位址序號 |
位元組在記憶體中的地址 |
16進位值 |
| 0x03 |
Byte3 |
01 |
| 0x02 |
Byte2 |
23 |
| 0x01 |
Byte1 |
45 |
| 0x00 |
Byte0 |
67 |
大尾就是高位位元組排放在記憶體的低端,低位位元組排放在記憶體的高端。例如一個4位元組的值為0x1234567的整數與高低位元組對應關係:
| 01 |
23 |
45 |
67 |
| Byte3 |
Byte2 |
Byte1 |
Byte0 |
| 高位位元組--à---------à--------------à低位位元組 |
將在記憶體中按照如下順序排放:
| 記憶體位址序號 |
位元組在記憶體中的地址 |
16進位值 |
| 0x03 |
Byte0 |
67 |
| 0x02 |
Byte1 |
45 |
| 0x01 |
Byte2 |
23 |
| 0x00 |
Byte3 |
01 |
2 網路位元組序TCP/IP各層協議將位元組序定義為大尾,因此TCP/IP協議中使用的位元組序通常稱之為網路位元組序。
3 字串在記憶體中的儲存(intel系列) 字串和整數是相反的,是安字串的索引從低到高儲存到記憶體中的; char s[4] = “abc”;
| a |
b |
c |
/0 |
| s[0] |
s[1] |
s[2] |
s[3] |
| |
將在記憶體中按照如下順序排放:
| 記憶體位址序號 |
16進位值 |
指標P的位置 |
| 0xbffeadf7 |
/0 |
p+3 |
| 0xbffeadf6 |
c |
p+2 |
| 0xbffeadf5 |
b |
p+1 |
| 0xbffeadf4 |
a |
p |
int main(void){ char s[4] = "abc"; char *p = s; printf("%02x, %02x, %02x, %02x/n", &s[0], &s[1], &s[2], &s[3]); printf("%02x, %02x, %02x, %02x/n", p, p+1, p+2, p+3); printf("%c, %c, %c, %c/n", s[0], s[1], s[2], s[3]); return 0;}輸出結果:[netcool@HFINMSP2 demo]$ ./demo001bffeadf4, bffeadf5, bffeadf6, bffeadf7bffeadf4, bffeadf5, bffeadf6, bffeadf7a, b, c,
4 整數數組在記憶體中的儲存(intel系列)同字串一樣,但是數組裡的每一個整數的儲存是按照小尾位元組序;
5 linux系統中的處理方法網路位元組序作為一個標準位元組序,如果系統並沒有提供相關的轉換函式,我們可以通過以下4個宏實現本地位元組序和網路位元組序的相互轉換:htons():將16位不帶正負號的整數從本地位元組序轉換成網路位元組序htonl():將32位不帶正負號的整數從本地位元組序轉換成網路位元組序ntohs():將16位不帶正負號的整數從網路位元組序轉換成本地位元組序ntohl():將32位不帶正負號的整數從網路位元組序轉換成本地位元組序
註:1、網路與主機位元組轉換函式:htons ntohs htonl ntohl (s 就是short l是long h是host n是network)2、不同的CPU上運行不同的作業系統,位元組序也是不同的,參見下表。處理器 作業系統 位元組排序Alpha 全部 Little endianHP-PA NT Little endianHP-PA UNIX Big endianIntelx86 全部 Little endian <-----x86系統是小端位元組序系統Motorola680x() 全部 Big endianMIPS NT Little endianMIPS UNIX Big endianPowerPC NT Little endianPowerPC 非NT Big endian <-----PPC系統是大端位元組序系統RS/6000 UNIX Big endianSPARC UNIX Big endianIXP1200 ARM核心 全部 Little endian