计算 IP 地址
Count IP addresses
我将以下 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地址计数器?
如果您需要将 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
应该这样做。
像@tadman 那样使用IPAddr
class 非常有意义,但应该注意的是class 中的方法并没有做任何特别的事情。如果将他的方法 ip
(唯一使用 IPAddr
方法的方法)替换为:
,@tadman 的回答就可以正常工作
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
事实上,与 IPAddr::new
不同,ip
适用于 IPv6(32**2
位)以及 IPv4(32
位)IP 的 (-:
str = "172.0.254.1.22.33.44.55"
tadip str #=> IPAddr::InvalidAddressError: invalid address
ip str #=> 12394185455143300151
在没有 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
我将以下 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地址计数器?
如果您需要将 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
应该这样做。
像@tadman 那样使用IPAddr
class 非常有意义,但应该注意的是class 中的方法并没有做任何特别的事情。如果将他的方法 ip
(唯一使用 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
事实上,与 IPAddr::new
不同,ip
适用于 IPv6(32**2
位)以及 IPv4(32
位)IP 的 (-:
str = "172.0.254.1.22.33.44.55"
tadip str #=> IPAddr::InvalidAddressError: invalid address
ip str #=> 12394185455143300151
在没有 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