Ruby の 2 つのネットワーク マスクの合計
概要
Amazon は現在 3.0.0.0/8 を所有しています どうやら 3.0.0.0/9 と 3.128.0.0/9 の 2 つのチャンクに分けて購入されたようです。
Ruby で 3.0.0.0/9 と 3.128.0.0/9 を追加し、結果 3.0.0.0/8 を得るプログラムを作成するにはどうすればよいですか?
この方法でマスクをcidrに変換できます。
"255.255.255.0" \
.split(".") \
.map { |e| e.to_i.to_s(2).rjust(8, "0") } \
.join \
.count("1") # => 24
しかし、あるマスクを別のマスクに追加するにはどうすればよいでしょうか?
これが私が今持っているものです:
[1] pry(main)> "3.128.0.0".split('.').map { |e| e.to_i.to_s(2).rjust(8, "0") }
=> ["00000011", "10000000", "00000000", "00000000"]
[2] pry(main)> "3.0.0.0".split('.').map { |e| e.to_i.to_s(2).rjust(8, "0") }
=> ["00000011", "00000000", "00000000", "00000000"]
上記の両方のアドレスに /9 を適用するにはどうすればよいですか?
解決策
要点を正しく理解できているかわかりませんが、これが役立つかもしれません。
計算を行うためのいくつかのメソッドを定義します。
def ip_to_bin(ip)
ip.split('.').map { |e| e.to_i.to_s(2).rjust(8, "0").split('').map(&:to_i) }
end
def network(ip, mask)
# convert string to array of bin
ip = ip_to_bin(ip)
mask = ip_to_bin(mask)
# then bitwise sums
ip.zip(mask).map { |e| e.first.zip(e.last).map { |s, a| s & a } }.map { |e| e.reverse.map.with_index { |d,i| d.to_i * 2**i }.sum }.join('.')
end
def cidr_to_mask(cidr)
(cidr.times.map{ 1 } + (32 - cidr).times.map{ 0 }).each_slice(8).map { |e| e.reverse.map.with_index { |d,i| d.to_i * 2**i }.sum }.join('.')
end
次に、次の方法を使用してネットワークを計算します。
cidr = 8
ip = "3.0.0.0"
mask = cidr_to_mask(cidr) #=> "255.0.0.0"
network(ip, mask) #=> "3.0.0.0"
もう一つの例:
network("176.232.53.237", cidr_to_mask(26)) #=> "176.232.53.192"
CIDR からホストの数を計算するには:
def nr_hosts_from(cidr)
((32-cidr).times.map{ 1 }).reverse.map.with_index { |d,i| d.to_i * 2**i }.sum - 1
end
nr_hosts_from(8) #=> 16777214
nr_hosts_from(9) #=> 8388606