这是一个棘手的...
你怎么知道一个ip,比如说62.156.244.13是在62.0.0.0和.的范围内62.255.255.255
是否有一种简单的Ruby方法可以做到这一点,或者我该如何解决这个问题?
Joh*_*ooy 84
>> require "ipaddr"
=> true
>> low = IPAddr.new("62.0.0.0").to_i
=> 1040187392
>> high = IPAddr.new("62.255.255.255").to_i
=> 1056964607
>> ip = IPAddr.new("62.156.244.13").to_i
=> 1050473485
>> (low..high)===ip
=> true
Run Code Online (Sandbox Code Playgroud)
如果给你网络而不是起始和结束地址,它甚至更简单
>> net = IPAddr.new("62.0.0.0/8")
=> #<IPAddr: IPv4:62.0.0.0/255.0.0.0>
>> net===IPAddr.new("62.156.244.13")
=> true
Run Code Online (Sandbox Code Playgroud)
IPAddr 也将使用IPv6地址
>> low = IPAddr.new('1::')
=> #<IPAddr: IPv6:0001:0000:0000:0000:0000:0000:0000:0000/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff>
>> high = IPAddr.new('2::')
=> #<IPAddr: IPv6:0002:0000:0000:0000:0000:0000:0000:0000/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff>
>> (low..high)===IPAddr.new('1::1')
=> true
Run Code Online (Sandbox Code Playgroud)
jdl*_*jdl 11
我会用这个杀手级的小函数将IP地址转换成整数,然后比较那些.
def ip_addr_in_range?(low, high, addr)
int_addr = numeric_ip(addr)
int_addr <= numeric_ip(high) && int_addr >= numeric_ip(low)
end
def numeric_ip(ip_str)
ip_str.split('.').inject(0) { |ip_num, part| ( ip_num << 8 ) + part.to_i }
end
def test_ip_addr_in_range(low, high, addr, expected)
result = ip_addr_in_range?(low, high, addr)
puts "#{addr} #{(expected ? 'should' : 'should not')} be within #{low} and #{high}: #{(expected == result ? 'PASS' : 'FAIL')}"
end
test_ip_addr_in_range("192.168.0.0", "192.168.0.255", "192.168.0.200", true)
test_ip_addr_in_range("192.168.0.0", "192.168.0.155", "192.168.0.200", false)
test_ip_addr_in_range("192.168.0.0", "192.168.255.255", "192.168.100.200", true)
test_ip_addr_in_range("192.168.0.0", "192.168.100.255", "192.168.150.200", false)
test_ip_addr_in_range("192.168.255.255", "192.255.255.255", "192.200.100.100", true)
test_ip_addr_in_range("192.168.255.255", "192.255.255.255", "192.100.100.100", false)
test_ip_addr_in_range("192.168.255.255", "255.255.255.255", "200.200.100.100", true)
test_ip_addr_in_range("192.168.255.255", "255.255.255.255", "180.100.100.100", false)
$ ruby ip_range.rb
192.168.0.200 should be within 192.168.0.0 and 192.168.0.255: PASS
192.168.0.200 should not be within 192.168.0.0 and 192.168.0.155: PASS
192.168.100.200 should be within 192.168.0.0 and 192.168.255.255: PASS
192.168.150.200 should not be within 192.168.0.0 and 192.168.100.255: PASS
192.200.100.100 should be within 192.168.255.255 and 192.255.255.255: PASS
192.100.100.100 should not be within 192.168.255.255 and 192.255.255.255: PASS
200.200.100.100 should be within 192.168.255.255 and 255.255.255.255: PASS
180.100.100.100 should not be within 192.168.255.255 and 255.255.255.255: PASS
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11754 次 |
| 最近记录: |