2012-04-23 94 views
5

可能重複:
IP Address to Integer - C轉換IP地址的整數

如何轉換的IP地址到整數形式如下: A.B. 或A.B.C. *或A. 。*或 我想寫一個C程序,它可以確定IP地址是否是另一個子集。例如IP地址192.168.125.5是192.168的子集。 。現在我想將這兩個IP地址轉換爲唯一的整數,然後檢查一個是否是另一個的子集。有沒有辦法做到這一點?

+0

你不想要將IP地址轉換爲整數。僅適用於IPv4的開始。你想將它們轉換爲適當長度的字節數組,然後對它們進行網絡掩碼操作。 – EJP 2012-04-24 08:42:02

+0

如果你的平臺擁有它,則使用'inet_pton()'。 – Jasen 2015-12-03 22:58:47

回答

7

一個IP地址,例如, 192.168.0.1可以很容易地寫成一個十六進制,它變成0xC0 0xA8 0x00 0x01或只是0xC0A80001

然後它只是一個比特匹配的情況,所以你構造了一個相應的子網掩碼,255.255.0.0這就是隻是0xFFFF0000地址,你可以測試這兩個比賽做:

0xC0A80001 & 0xFFFF0000 == 0xC0A80000 & 0xFFFF0000 

在平等測試的一側,而另一側是一個真正的地址,在「你關心基地的東西」,與給定的面具作爲雙方相同。

通常你可以通過設置'*'爲0的東西以及實際數字爲0xFF的東西來構造一個合適的掩碼,如果你想要更精細的穀物掩模,用'*'很難表達。

1

易於和非一般的方法是使用的sscanf(與詮釋A,B,C,d): sscanf(ip, "%d.%d.%d.%d", &a, &b, &c, &d); 但它只能如果您有IP與所有部分:10.47.100.1

如果不是這種情況,仍然可以使用返回的值sscanf,它會告訴您有多少匹配找到(或EOF)成功。

經過4個號碼後,您可以檢查子集關係。

+0

不,我想將IP地址轉換爲整數,然後檢查子集關係.... – mmuttam 2012-04-23 15:47:32

+0

您仍然可以從您得到的4中構造一個整數。困難的部分是解析整數。稍後,您可以像其他人在此處所建議的那樣將它們左移。 – 2012-04-23 15:59:19

0

單個整數(假設爲32位)不足以表示要顯示的內容。你需要更多的信息才能表達星號。例如,你可以有一對(地址,網絡掩碼),其中網絡掩碼或者是代表有效高位位數的單個小整數,因此例如網絡地址如「10.0」。 0.0「可以由對(0x0a000000,8)表示。如果你真的想在地址中出現通配符,出於某種原因,每個地址位都需要一組完整的標誌位,所以需要兩個32位整數。然後你可以像「192.168。」這樣的對(0xc0a80000,0xffff0000)。

12

你想要的是確定一個IP地址是否在一個子網中,並做到這一點,你想申請一個網絡掩碼。有可能(當然)庫已經在那裏做你想做的。這是如果你想推出自己的。

如果該IP地址來自受信任的來源(即非用戶),那麼你可以簡單地做這樣的事情提取一個標準的C-string中的IP地址:

char ipAddressString[16] = "192.168.125.5" 
char netMaskString[16] = "255.255.0.0" 
char subnetString[16] = "192.168.0.0" 

uint32_t ipAddress = parseIPV4string(ipAddressString); 
uint32_t netmask = parseIPV4string(netmaskString); 
uint32_t subnet = parseIPV4string(subnetString); 

if (ipAddress & netmask == subnet) { 
    return true; 
} 

uint32_t parseIPV4string(char* ipAddress) { 
    char ipbytes[4]; 
    sscanf(ipAddress, "%uhh.%uhh.%uhh.%uhh", &ipbytes[3], &ipbytes[2], &ipbytes[1], &ipbytes[0]); 
    return ipbytes[0] | ipbytes[1] << 8 | ipbytes[2] << 16 | ipbytes[3] << 24; 
} 
+0

不錯,謝謝你的解析器邏輯! – 2015-03-17 01:45:18

+1

在char(ipbytes [x])指針中讀取int(%d)會導致嚴重錯誤,因爲sscanf會將sizeof(int)字節寫入ipbytes [x]指向的內存中。這個例子非常危險。 – Zac 2015-10-13 14:20:44

+2

@Zac多麼尷尬!我修復了錯誤。 – OmnipotentEntity 2015-10-13 14:25:07