Posted on 2010-04-24 23:41
~William~ 閱讀(1061)
評論(0) 編輯 收藏 引用 所屬分類:
C語言基礎
大端法(Big_Endian):高位字節(jié)存放在內存的低地址端即該值的起始地址,低位字節(jié)存放在內存的高地址端。
小端法(Little_Endian):低位字節(jié)存放在內存的低地址即該值的起始地址,高位字節(jié)存放在內存的高地址位。
舉例說明:
對于整形0x12345678。它在大端法和小端法的系統(tǒng)內中,分別如圖1所示的方式存放。

網(wǎng)絡字節(jié)序
我們知道網(wǎng)絡上的數(shù)據(jù)流是字節(jié)流,對于一個多字節(jié)數(shù)值,在進行網(wǎng)絡傳輸?shù)臅r候,先傳遞哪個字節(jié)?也就是說,當接收端收到第一個字節(jié)的時候,它是將這個字節(jié)作為高位還是低位來處理呢?
網(wǎng)絡字節(jié)序定義:收到的第一個字節(jié)被當作高位看待,這就要求發(fā)送端發(fā)送的第一個字節(jié)應當是高位。而在發(fā)送端發(fā)送 數(shù)據(jù)時,發(fā)送的第一個字節(jié)是該數(shù)字在內存中起始地址對應的字節(jié)。可見多字節(jié)數(shù)值在發(fā)送前,在內存中數(shù)值應該以大端法存放。
網(wǎng)絡字節(jié)序說 是大端字節(jié)序。
比如我們經(jīng)過網(wǎng)絡發(fā)送0x12345678這個整形,在80X86平臺中,它是以小端法存放的,在發(fā)送前需要使用系統(tǒng)提供的htonl將其轉換成大端法存放,如圖2所示。

判斷大小端的方法:
/*
@brief 判斷當前平臺式的大小端,利用聯(lián)合體的字節(jié)排序是按照從低到高的特性
@return 1小端 0 大端
*/
int GetTypeOfEndian(void)
{
Union w
{
int a;
char b;
};
union w c;
c.a = 1;
return (c.b == 1);
}