2013-12-13 76 views

回答

2

只是爲了引導你在正確的方向,考慮IPv4地址是什麼(32位整數)。現在,考慮掩碼是什麼(在按位操作中使用的位字段)。

在大端系統上取地址127.0.0.1。以十六進制表示,即0x7f000001。一個24位掩碼是0xffffff00(24位1,8位0,32位總數)。按位和地址以及掩碼0x7f000001 & 0xffffff00 = 0x7f000000是CIDR格式。

我把它留給你,以確定如何最好地解析地址,將IPv4地址轉換爲其整數形式(和返回),並從路由前綴掩碼創建一個位掩碼,但我會告訴你,有標準功能至少用於地址操作。

2

所以基本上,一個IPV4地址和網絡掩碼是32位無符號整數,以8位成對顯示,它們之間有一個點。

所以,如果你有「ABCD」,你可以通過做

(a<<24) + (b<<16) + (c<<8) + d 

如果你不習慣< <它獲得整數值的數量將這個位的時候左邊的數字作爲正確的參數。因此,a<<ba*2^b相同

現在在CIDR中,斜線後面的數字告訴您在斜線前數字的網絡部分有多少位(32)。例如。 10.10.10.1/28有28位網絡和32-28 = 4位主機部分。這意味着,如果你把ip轉換成一個數字(= 0x0A0A0A01),並執行邏輯&與0xFFFFFFFF < < 4(= 0xFFFFFFF0),你會得到0x0A0A0A00。如果你將它翻譯成以下IP地址:

sprintf("%d.%d.%d.%d", (n>>24)&0xff, (n>>16)&0xff, (n>>8)&0xff, n&0xff) 

你得到10.10.10.0。同樣,如果將0xFFFFFFF0轉換爲具有相同算法的ip,則會獲得255.255.255.248這是掩碼長度爲28的網絡掩碼。

IPv6完全相同,除了它的128位分爲8個16位羣集十六進制與它們之間的逗號與一些奇特的快捷方式多個運行0(::) ..

eg。

fe80::52e5:49ff:ffc9:1889/64 == 

;;convert the mask 
0xffffffffffffffffffffffffffffffff << (128-64) = 
0xffffffffffffffff0000000000000000 

;;convert the ip: 
fe80::52e5:49ff:ffc9:1889 == 
fe80:0000:0000:0000:52e5:49ff:ffc9:1889 == 
0xfe8000000000000052e549ffffc91889 

    0xfe8000000000000052e549ffffc91889 
& 0xffffffffffffffff0000000000000000 
= 0xfe800000000000000000000000000000 

;;convert first address in range back to string: 
fe80:0000:0000:0000:0000:0000:0000:0000 = 
fe80:: 

我想在這個基礎上,你可以做一個你想做的功能。

+1

謝謝。我也在網上找到了一個類似的方法。然而,我正在尋找一些標準的C++庫來執行類似的任務?我想沒有必要爲此設置我自己的功能。將完成後發佈代碼。 – chingupt