Сумма двух сетевых масок в рубине - PullRequest
0 голосов
/ 09 ноября 2018

Амазонке теперь принадлежит 3.0.0.0/8 Видимо, купил в двух кусках: 3.0.0.0/9 и 3.128.0.0/9.

Как мне написать программу на 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 к обоим адресам выше?

1 Ответ

0 голосов
/ 10 ноября 2018

Не знаю, правильно ли я понял, но, возможно, это поможет.

Определение некоторых методов для расчетов:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...