主機位元組序

主機位元組序

網路位元組序與主機位元組序是經常導致混淆的兩個概念,網路位元組序是確定的,而主機位元組序的多樣性往往是混淆的原因。

不同的CPU有不同的字節序類型 這些位元組序是指整數在記憶體中保存的順序 這個叫做主機序

最常見的有兩種

1. Little endian:將低序位元組存儲在起始地址
2. Big endian:將高序位元組存儲在起始地址
LE little-endian
最符合人的思維的位元組序
地址低位存儲值的低位
地址高位存儲值的高位
怎么講是最符合人的思維的位元組序,是因為從人的第一觀感來說
低位值小,就應該放在記憶體地址小的地方,也即記憶體地址低位
反之,高位值就應該放在記憶體地址大的地方,也即記憶體地址高位
BE big-endian
最直觀的位元組序
地址低位存儲值的高位
地址高位存儲值的低位
為什麼說直觀,不要考慮對應關係
只需要把記憶體地址從左到右按照由低到高的順序寫出
把值按照通常的高位到低位的順序寫出
兩者對照,一個位元組一個位元組的填充進去

舉例說明

例子:在記憶體中雙字0x01020304(DWORD)的存儲方式
記憶體地址
4000 4001 4002 4003
LE 04 03 02 01
BE 01 02 03 04
例子:如果我們將0x1234abcd寫入到以0x0000開始的記憶體中,則結果為
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x34 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
x86系列CPU都是little-endian的位元組序.

相關程式

下面是一個檢驗本機位元組序的簡便方法:
//判斷本機的位元組序
//返回true表為小段序。返回false表示為大段序
bool am_little_endian ()
{
unsigned short i=1;
return (int)*((char *)(&i)) ? true : false;
}
int main()
{
if(am_little_endian())
{
printf("本機位元組序為小段序!\n");
}else
{
printf("本機位元組序為大段序!\n");
}
return 0;
}

相關詞條

相關搜尋

熱門詞條

聯絡我們