Ruby:如何将IP范围转换为IP数组';s

Ruby:如何将IP范围转换为IP数组';s,ruby,ip,Ruby,Ip,有没有简单的方法将IP范围转换为IP阵列 def convertIPrange (start_ip, end_ip) #output: array of ips end end e、 g.投入 ('192.168.1.105', '192.168.1.108') 输出 ['192.168.1.105','192.158.1.106','192.158.1.107','192.158.1.108'] 使用Ruby标准库 使用Ruby标准库 虽然将范围转换为数组很容易,但要非常小心。范围是

有没有简单的方法将IP范围转换为IP阵列

def convertIPrange (start_ip, end_ip)
 #output: array of ips end
end
e、 g.投入

('192.168.1.105', '192.168.1.108') 
输出

['192.168.1.105','192.158.1.106','192.158.1.107','192.158.1.108']

使用Ruby标准库


使用Ruby标准库



虽然将范围转换为数组很容易,但要非常小心。范围是存储端点的一种非常紧凑和高效的方式,因为它只是端点。另一方面,数组是所有消耗内存的点,包括它们之间的所有点。考虑包含IPS的数组在A/8 CIDR中的含义。如果是一个更大的网络,或者您正在处理IPv6,情况只会变得更糟。虽然将范围转换为阵列很容易,但要非常小心。范围是存储端点的一种非常紧凑和高效的方式,因为它只是端点。另一方面,数组是所有消耗内存的点,包括它们之间的所有点。考虑包含IPS的数组在A/8 CIDR中的含义。如果它是一个更大的网络,或者你正在处理IPv6,情况只会变得更糟。
s/convertIPrange/convert\u ip\u range/
@theTinMan我不喜欢方法名,但OP就是这么问的。如果我用另一个名字写一个方法,它就不会回答OP的问题。@theTinMan你写的另一个答案是唯一做正确事情的答案。这个有什么问题?虽然它可以工作,但它没有利用内置类,内置类提供了许多附加功能,包括检查提交的IP是否有效。请尝试将convertIPrange('0.0.0.0','0.0.0.256')@theTinMan OP没有提到它可能来自用户输入,因此我假设这些值是有效的。虽然,我不知道这个库,并且同意使用它更好。
s/convertIPrange/convert\u ip\u range/
@theTinMan我不喜欢这个方法名,但这就是OP所要求的。如果我用另一个名字写一个方法,它就不会回答OP的问题。@theTinMan你写的另一个答案是唯一做正确事情的答案。这个有什么问题?虽然它可以工作,但它没有利用内置类,内置类提供了许多附加功能,包括检查提交的IP是否有效。请尝试将convertIPrange('0.0.0.0','0.0.0.256')@theTinMan OP没有提到它可能来自用户输入,因此我假设这些值是有效的。虽然,我不知道这个库,并且同意使用它更好。+1是唯一的答案,做正确的事情并使用IPAddr。gem的功能更加全面,尤其是在进行网络操作时。+1,但是IPAddr不在核心中,而是在标准库中。这是正确答案的原因,是IPAddr将自动处理IP范围,而不仅仅是最后一个八位字节的更改。它将产生一个大数组,但它仍然会做正确的事情。@theTinMan我的答案也是如此。@steenslag谢谢,我把dem弄混了。更正。唯一正确的答案是+1,使用IPAddr。gem的功能更加全面,尤其是在进行网络操作时。+1,但是IPAddr不在核心中,而是在标准库中。这是正确答案的原因,是IPAddr将自动处理IP范围,而不仅仅是最后一个八位字节的更改。它将产生一个大数组,但它仍然会做正确的事情。@theTinMan我的答案也是如此。@steenslag谢谢,我把dem弄混了。更正。
def convertIPrange first, last
  first, last = [first, last]
    .map{|s| s.split(".").inject(0){|i, s| i = 256 * i + s.to_i}}
  (first..last).map do |q|
    a = []
    (q, r = q.divmod(256)) && a.unshift(r) until q.zero?
    a.join(".")
  end
end

convertIPrange('192.168.1.105', '192.168.1.108')
# => ["192.168.1.105", "192.168.1.106", "192.168.1.107", "192.168.1.108"]

convertIPrange('192.255.255.254', '193.0.0.1')
# => ["192.255.255.254", "192.255.255.255", "193.0.0.0", "193.0.0.1"]
# I would suggest naming your function using underscore rather than camelcase
# because of Ruby naming conventions
#
require 'ipaddr'

def convert_ip_range(start_ip, end_ip)
  start_ip = IPAddr.new(start_ip)
  end_ip   = IPAddr.new(end_ip)

  # map to_s if you like, you can also call to_a, 
  # IPAddrs have some neat functions regarding IPs, 
  # be sure to check them out
  #
  (start_ip..end_ip).map(&:to_s) 
end