雖然我知道 Network order 與 Host order 的關係不見得一樣,在一般 Host (windows/linux) 的 order 和 Network order 剛好相反,而 Apple 的系統 OS 則與 Network order 一樣(現在新的 0S X 之後以 Unix/Linux 為 base 的系統我就不清楚了,不過既然以 Unix/Linux 為 base,那應該和一般的 Unix/Linu order 一樣吧)
為什麼要特別一提呢?我發現真正要用的時候自己還是忍不住寫個小程式測試一下....用最簡單的例子,我們計算數學時,當數字發生進位的情況,進位的數字會往前加,而前面是那邊呢?沒錯,就是左邊,以這方向來看,越左邊數字代表含意越大,這表示方式就跟 Network order 一樣,而相反,越右邊表示越大則就跟 Windows/Linux 的 Order 一樣,後面提到 Host order 皆以 windows/linux 情況來討論
而一般 IP 表示法都是用 4 個 1Byte 的十進位數字來表示,所以數字範圍在 0~255 之間,所以當 127.0.0.1 以 4Byte 來存放並以「數字」方式解析就會變成
127x16^3 + 0x16^2 + 0x16^1 + 1x16^0
最後得到 0x7F000001 ,這表示法就是 network order,而如果以 Host order 來看就成了 0x0100007F 了,也就是 Host order 真正擺在記憶體的順序是如此
在 C 我們常常用的技巧就是將 4Bytes 的 unsigned int 透過 cast 方式變成 4 個 entry 的 unsigned char array,這時候就容易搞混到底我要改 127.0.0.1 的 127 是在 index 0 還是 index 3 的 entry,直覺一點的記法,當出現在第一個,就是在 array 的第一個位置,同理在第四個就是在 array 第四個位置,這時不要再考慮 order 問題反而會把自己搞混..
寫個小程式來測試一下
#include
#include
int main()
{
struct in_addr addr;
addr.s_addr = inet_addr("127.0.0.1");
printf("==>%u.%u.%u.%u\n",
((unsigned char *)&addr.s_addr)[0],
((unsigned char *)&addr.s_addr)[1],
((unsigned char *)&addr.s_addr)[2],
((unsigned char *)&addr.s_addr)[3]);
printf("===>%8x\n", add.s_addr);
}

0 Comments:
Post a Comment