回答
這裏是快速和骯髒的方式
require 'ipaddr'
puts IPAddr.new("255.255.255.0").to_i.to_s(2).count("1")
應該有,我無法找到應有的功能,所以我算了算「1」
如果你要可以用在許多地方的功能,不介意的monkeypatching,這可能幫助:
IPAddr.class_eval
def to_cidr
"/" + self.to_i.to_s(2).count("1")
end
end
然後你得到
IPAddr.new('255.255.255.0').to_cidr
# => "/24"
我不確定有什麼比使用count更合適(「1」)。也許這樣? 32 - (2 ** 32 - 1 - IPAddr.new(「255.255.255.0」)to_i).to_s(2)。長度' –
在C中,我可能會轉移到右側,並使用&1進行測試,直到它達到1,例如,「bits = 32; unsigned int ipaddr = 0xFFFFFF00; while(ipaddr&1 == 0){ipaddr = ipaddr> > 1; bits - ;}'對於上面的情況,我只需要向右移8次就可以了。 – YOU
正如僅供參考,並保持信息對於那些誰是尋找方便...
下面是從CIDR轉換爲網絡掩碼格式的簡單方法:
def cidr_to_netmask(cidr)
IPAddr.new('255.255.255.255').mask(cidr).to_s
end
例如:
cidr_to_netmask(24) #=> "255.255.255.0"
cidr_to_netmask(32) #=> "255.255.255.255"
cidr_to_netmask(16) #=> "255.255.0.0"
cidr_to_netmask(22) #=> "255.255.252.0"
如果您不需要使用IP地址的寶石,你可以用netaddr寶石做到這一點
require 'netaddr'
def to_cidr_mask(dotted_mask)
NetAddr::CIDR.create('0.0.0.0/'+dotted_mask).netmask
end
to_cidr_mask("255.224.0.0") # => "/11"
以下是一個數學方法,避免不惜一切代價的字符串:
def cidr_mask
Integer(32-Math.log2((IPAddr.new(mask,Socket::AF_INET).to_i^0xffffffff)+1))
end
與「面具」是像255.255.255.0的字符串。如果「掩碼」已經是IP地址的整數表示形式,您可以對其進行修改並將第一個參數更改爲「掩碼」。
因此,舉例來說,如果遮蓋物爲 「255.255.255.0」,IPAddr.new(屏蔽,插座:: AF_INET).to_i將成爲0xffffff00,然後將其用爲0xffffffff,這相當於255
XOR運算我們加1以使其成爲256個主機的完整範圍,然後找到256的等於8(用於主機地址的位)的日誌庫2,然後從32中減去8,即等於24(用於網絡地址的位)。
然後我們轉換爲整數,因爲Math.log2返回一個浮點數。
快速和髒的轉換:
.to_i
"255.255.255.0".split(".").map { |e| e.to_i.to_s(2).rjust(8, "0") }.join.count("1").split(".")
=>我在Array
.map { |e| e.to_i.to_s(2).rjust(8, "0") }
=>在陣列分割掩碼對於每個元素
=>轉換成整數
.to_s(2)
=>轉換整數成二進制
.rjust(8, "0")
=>添加填充
=>地圖返回一個陣列具有相同基數
.join
=>轉換陣列成一個完整的字符串
.count("1")
=>計數 「1」 字符數=>提供CIDR掩模
def mask_2_ciddr mask
"/" + mask.split(".").map { |e| e.to_i.to_s(2).rjust(8, "0") }.join.count("1").to_s
end
mask_2_ciddr "255.255.255.0"
=> "/24"
mask_2_ciddr "255.255.255.128"
=> "/25"
require 'ipaddr'
def serialize_ipaddr(address)
mask = address.instance_variable_get(:@mask_addr).to_s(2).count('1')
"#{address}/#{mask}"
end
serialize_ipaddr(IPAddr.new('192.168.0.1/24')) # => "192.168.0.0/24"
該代碼通過訪問私人達到掩蔽實例變量* @ mask_addr)的IPAddr實例(地址,傳入serialize_ipaddr)。這是不推薦的方式(如實例變量不是類的公共API的一部分,但在這裏比在我看來解析來自#inspect字符串更好
所以過程如下:
- 獲取實例變量@mask_addr表示掩碼
- 獲取其二進制表示例如
255.255.255.0 -> 4294967040 -> 11111111111111111111111100000000
- 計數的1-S中的基極 - 2號以獲取CIDR掩模(24)
- 彌補由地址&面具
編輯字符串:加解釋的實施由NathanOliver
的要求儘管此代碼片段可能會解決問題,但[包括解釋](http://meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answers)確實有助於提高您的質量帖子。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 – NathanOliver
- 1. CIDR /子網掩碼
- 2. 將CIDR地址轉換成子網掩碼和網絡地址
- 3. 紅寶石1.8.7和網絡服務
- 4. 用紅寶石連接Tor網絡
- 5. 用於紅寶石的神經網絡
- 6. 使用紅寶石的網絡隧道
- 7. 捲曲和網絡的Http紅寶石
- 8. 從給定的網絡掩碼計算CIDR - Java
- 9. 在C++中將網絡掩碼轉換爲CIDR格式
- 10. 檢查IP是否在CIDR網絡掩碼(範圍)
- 11. 改組紅寶石網址
- 12. 紅寶石網/ http難點
- 13. 紅寶石:網:: HTTP.start問題
- 14. 紅寶石 - 創建網格
- 15. 平紅寶石網站?
- 16. 使用網:: HTTP紅寶石
- 17. 啓動紅寶石 - 我的第一個紅寶石網站
- 18. 非紅寶石網站上的紅寶石錯誤
- 19. 將網絡/掩碼與另一個網絡/掩碼比較
- 20. 紅寶石 - 如何運行Windows cmd上的紅寶石代碼
- 21. 紅寶石散列在紅寶石
- 22. 紅寶石串編碼力
- 23. 解析紅寶石代碼
- 24. Caeser密碼紅寶石
- 25. 紅寶石編碼問題
- 26. ASCII85 BASE64紅寶石編碼
- 27. 編碼紅寶石1.8.7串
- 28. 紅寶石1.9.2 Find.find編碼
- 29. 逃逸紅寶石代碼
- 30. 紅寶石錯誤代碼
一種解決方案可能是使用ipadmin寶石,而不是它看起來更完整。 我仍然有興趣從代碼的角度來看看這個解決方案。 –