计算IP地址

时间:2015-06-04 17:23:02

标签: ruby ip-address

我将以下IP存储在一个数组中:

10.2.3.1
10.2.3.5
10.2.3.10 - 10.2.3.15

我试图计算IP地址的总数。 IP地址的总数应为8.当我遍历数组时,我总共得到三个计数。我需要一种方法来计算第三项:

10.2.3.10 - 10.2.3.15

是否有任何IP地址计数器?

3 个答案:

答案 0 :(得分:4)

如果您需要将IP转换为范围,您需要一个将IPv4值转换为整数的函数,然后对这些函数进行数学运算:

require 'ipaddr'

def ip(string)
  IPAddr.new(string).to_i
end

def parse_ip(string)
  string.split(/\s+\-\s+/).collect { |v| ip(v) }
end

def ip_range(string)
  ips = parse_ip(string)

  ips.last - ips.first + 1
end

ip_range("10.2.3.10 - 10.2.3.15")
# => 6

应该这样做。

答案 1 :(得分:1)

使用insert into ships select ship name,class,launched from (select distinct ship,c.class,country from outcomes o join classes c on c.class=o.ship where ship not in(select distinct name from ships)) f join (select country,round(avg(launched*1.0),0) launched from ships s join classes c on c.class=s.class group by country) n on f.country = n.country where n.launched is not null 类非常有意义,就像@tadman一样,但应该注意的是,该类中的方法没有做任何特别的事情。如果他的方法IPAddr(使用ip方法的唯一方法)替换为:@ / p>,那么@ tadman的答案就可以了。

IPAddr

让我们进行比较:

def ip(str)
  str.split('.').map { |s| s.to_i.to_s(2).rjust(8,'0') }.join.to_i(2)
end

事实上,require 'ipaddr' def tadip(string) IPAddr.new(string).to_i end str = "10.2.3.10" tadip str #=> 167904010 ip str #=> 167904010 str = "255.255.255.255" tadip str #=> 4294967295 ip str #=> 4294967295 str = "172.0.254.1" tadip str #=> 2885746177 ip str #=> 2885746177 ip不同,适用于IPv6(IPAddr::new位)以及IPv4(32**2位)IP( - :< / p>

32

答案 2 :(得分:0)

在没有 ipaddr 库的情况下计算两个 IP 之间的间隔:)

int32start = "10.0.0.0".split(".").map(&:to_i).pack('CCCC').unpack('N')[0]
int32ending = "10.0.0.50".split(".").map(&:to_i).pack('CCCC').unpack('N')[0]
puts int32ending - int32start #50