字節(jié)序就是字節(jié)在內(nèi)存中的存儲(chǔ)順序歹垫,如果是單字節(jié),這個(gè)順序就無(wú)所謂颠放,但是對(duì)于多字節(jié)排惨,這個(gè)順序就很重要了。根據(jù)這個(gè)順序字節(jié)序分為大端序(big-endian)
和小端序(little-endian)
碰凶,還有一種不太常見(jiàn)的混合序(middle-endian)
暮芭。
大端序 & 小端序 & 混合序
大端序(big-endian):數(shù)據(jù)的高位字節(jié)存放在地址的低端 低位字節(jié)存放在地址高端
小端序(little-endian):數(shù)據(jù)的高位字節(jié)存放在地址的高端 低位字節(jié)存放在地址低端
混合序(middle-endian):數(shù)據(jù)的存放一部分按大端序規(guī)則鹿驼,一部分按小端序規(guī)則
下面以int
類型4
字節(jié)數(shù)字0x12345678
為例說(shuō)明:
那么為什么會(huì)出現(xiàn)不同的字節(jié)序呢?計(jì)算機(jī)對(duì)數(shù)字進(jìn)行處理的時(shí)候谴麦,都是先從低位開(kāi)始處理的蠢沿,所以小端序就非常適合計(jì)算機(jī)進(jìn)行數(shù)據(jù)處理,這樣能提高計(jì)算機(jī)處理數(shù)據(jù)的效率匾效。但是人類在讀寫(xiě)數(shù)字的時(shí)候舷蟀,還是習(xí)慣從高位開(kāi)始,這樣就大端序就適合人類讀寫(xiě)面哼。
網(wǎng)絡(luò)字節(jié)序 & 主機(jī)字節(jié)序
網(wǎng)絡(luò)字節(jié)順序:網(wǎng)絡(luò)字節(jié)順序是
TCP/IP
中規(guī)定好的一種數(shù)據(jù)表示格式野宜,它與具體的CPU
類型、操作系統(tǒng)等無(wú)關(guān)魔策,從而可以保證數(shù)據(jù)在不同主機(jī)之間傳輸時(shí)能夠被正確解釋匈子。網(wǎng)絡(luò)字節(jié)順序采用大端序(big-endian)
排序方式。
主機(jī)字節(jié)序:就是數(shù)據(jù)在內(nèi)存中存儲(chǔ)采用的字節(jié)序闯袒。
判斷機(jī)器的字節(jié)序
思路就是用一個(gè)高于1
字節(jié)的數(shù)據(jù)虎敦,然后想辦法讀取它的最低的那個(gè)字節(jié)。這里給個(gè)示例:
void cpu_endianness() {
int a = 0x12345678;
int first_bit = *((char*)&a);
if (first_bit == 0x12) {
printf("big endian.\n");
} else if (first_bit == 0x78) {
printf("little endian.\n");
} else {
printf("others endian.\n");
}
}
更新2017.06.18
這是一系列文章的其中一篇政敢,你可以在這兒Encode & Decode集序找到他其他的兄弟其徙。