簡體   English   中英

為什么inet_ntoa和inet_ntop“反轉”字節?

[英]Why do inet_ntoa and inet_ntop “reverse” the bytes?

這是一個相當基本的問題,令我驚訝的是,我今天遇到了一個問題。

它看起來像inet_pton和inet_ntoa正在反轉他們給出的IP地址的字節:

DWORD IP;
inet_pton(AF_INET, "192.168.0.1", &IP);
printf("%08X\n", IP);

這將打印0100A8C0 好吧,如果我們分解字節,它是01.00.A8.C0 = 1.0.168.192

同理:

IP = 0x7F000001;
struct in_addr ia;
ia.S_un.S_addr = IP;

printf("%s\n", inet_ntoa(ia));

給了我1.0.0.127

首先想到的是字節序,但我已經閱讀了MSDN文檔( 12 )並且沒有提到字節順序; 對我來說,這些函數會隨意決定使用其中一種符號而沒有明確說明這一點,這似乎很奇怪。

到底是怎么回事?

Endianness 原因。

這些函數的重點不是產生一個“可讀”的整數,而是設置一個准備好在線上傳出的32位數量。 IPv4需要大端排序,所以如果你做了printf("%02X\\n", ((char *)&IP)[0])); ,我會打賭printf("%02X\\n", ((char *)&IP)[0])); ,你得到C0

大小超過一個字節的數量(短路,整數等)必須按照Internet標准要求以網絡字節順序保留線路,默認情況下是Big-endian。

因此,這些函數(如inet_ptoninet_ntoahtonshtonl和其他類似函數)負責根據主機的字節順序交換這些數量的字節。 另一方面,接收器應使用相應的函數將網絡字節順序轉換為正確的字節順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM