2013-12-16 2 views
4

IP 범위를 IP 배열로 변환하는 쉬운 방법이 있습니까?Ruby : IP 범위를 IP 배열로 변환하는 방법

def convertIPrange (start_ip, end_ip) 
#output: array of ips end 
end 

입력

('192.168.1.105', '192.168.1.108') 

출력

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

가 배열의 범위를 변환 쉽게하는 동안은, 그렇게 조심 매우 * * 수. Range는 엔드 포인트 만 있기 때문에 엔드 포인트를 저장하는 매우 컴팩트하고 효율적인 방법입니다. 반면에 배열은 모든 요소를 ​​포함하여 모든 요소를 ​​포함하여 모든 요소가 메모리를 사용합니다./8 CIDR에서 IP가 포함 된 배열의 의미를 고려하십시오. 더 큰 네트워크이거나 IPv6을 다루는 경우에만 악화됩니다. –

답변

9

사용하여 루비 표준 라이브러리 IPAddr

# 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 
+0

올바른 일을하고 IPAddr을 사용하는 유일한 대답은 +1입니다. [IPAddress] (https://github.com/bluemonk/ipaddress) 젬은 특히 네트워크 조작을 할 때 더욱 완벽한 기능을 갖추고 있습니다. –

+0

+1, 그러나 IPAddr은 핵심이지만 표준 lib에는 없습니다. – steenslag

+0

이것이 올바른 대답 인 이유는 IPAddr이 마지막 옥텟 변경이 아닌 IP 범위를 자동으로 처리한다는 것입니다. 큰 배열을 만들지 만 여전히 올바른 일을 할 것입니다. –

2
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"] 
+0

's/convertIPrange/convert_ip_range /' –

+0

@theTinMan 나는 메소드 이름을 좋아하지 않지만 그것이 OP가 요구하는 것입니다. 다른 이름으로 메소드를 작성하면 OP 질문에 응답하지 않습니다. – sawa

+0

@theTinMan 당신은 옳은 일을하는 유일한 대답이 다른 답이라고 썼습니다. 이게 뭐가 잘못 되었 니? – sawa

관련 문제