我有一個需要轉換爲CIDR表示法的ipaddress/mask的列表。如何使用C++將ipaddress/mask轉換爲CIDR?
例如, 12.174.36.240/24需要轉換爲12.174.36.0/24 或類似的東西http://www.subnet-calculator.com/cidr.php確實
這怎麼能達到?
PS:屏蔽值並不總是24.
我有一個需要轉換爲CIDR表示法的ipaddress/mask的列表。如何使用C++將ipaddress/mask轉換爲CIDR?
例如, 12.174.36.240/24需要轉換爲12.174.36.0/24 或類似的東西http://www.subnet-calculator.com/cidr.php確實
這怎麼能達到?
PS:屏蔽值並不總是24.
只是爲了引導你在正確的方向,考慮IPv4地址是什麼(32位整數)。現在,考慮掩碼是什麼(在按位操作中使用的位字段)。
在大端系統上取地址127.0.0.1。以十六進制表示,即0x7f000001
。一個24位掩碼是0xffffff00
(24位1,8位0,32位總數)。按位和地址以及掩碼0x7f000001 & 0xffffff00 = 0x7f000000
是CIDR格式。
我把它留給你,以確定如何最好地解析地址,將IPv4地址轉換爲其整數形式(和返回),並從路由前綴掩碼創建一個位掩碼,但我會告訴你,有標準功能至少用於地址操作。
所以基本上,一個IPV4地址和網絡掩碼是32位無符號整數,以8位成對顯示,它們之間有一個點。
所以,如果你有「ABCD」,你可以通過做
(a<<24) + (b<<16) + (c<<8) + d
如果你不習慣< <它獲得整數值的數量將這個位的時候左邊的數字作爲正確的參數。因此,a<<b
與a*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::
我想在這個基礎上,你可以做一個你想做的功能。
謝謝。我也在網上找到了一個類似的方法。然而,我正在尋找一些標準的C++庫來執行類似的任務?我想沒有必要爲此設置我自己的功能。將完成後發佈代碼。 – chingupt
http://stackoverflow.com/questions/6657475/netmask-conversion-to-cidr-format-in-c –