You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Ruby生成两个IP地址之间(含首尾)的IP数组?

解决Ruby中生成IP地址范围数组的问题

嘿,我明白你碰到的麻烦了——直接用Ruby的字符串范围运算符..处理IP地址是行不通的,因为它只会按字符串的字符顺序来比较,而不是IP对应的实际数值。比如"192.168.1.100"作为字符串,会被认为比"192.168.1.3"小(因为第三个点后的"100"首字符是'1',而"3"是'3'),所以你的原代码会返回空数组,完全达不到预期效果。

下面给你两种可靠的解决方案:

方法一:手动实现IP与整数的转换

先把IP地址转换成对应的32位整数,生成整数范围后再转回IP字符串:

# 将IP字符串转为整数
def ip_to_int(ip)
  ip.split('.').map(&:to_i).pack('C*').unpack('N').first
end

# 将整数转回IP字符串
def int_to_ip(int)
  [int].pack('N').unpack('C*').join('.')
end

# 处理你的IP范围字符串
ip_range_str = "192.168.1.3-192.168.1.100"
start_ip, end_ip = ip_range_str.split('-')

# 生成包含首尾的IP数组
ip_array = (ip_to_int(start_ip)..ip_to_int(end_ip)).map { |int| int_to_ip(int) }

方法二:使用Ruby标准库IPAddr(推荐)

Ruby的IPAddr类已经内置了IP与整数的转换功能,用它更简洁也更可靠,还能兼容IPv6:

require 'ipaddr'

ip_range_str = "192.168.1.3-192.168.1.100"
start_ip, end_ip = ip_range_str.split('-')

start_int = IPAddr.new(start_ip).to_i
end_int = IPAddr.new(end_ip).to_i

# 生成目标数组
ip_array = (start_int..end_int).map { |int| IPAddr.new(int, Socket::AF_INET).to_s }

两种方法最终都会得到你想要的数组:["192.168.1.3","192.168.1.4",.....,"192.168.1.99","192.168.1.100"]。

内容的提问来源于stack exchange,提问作者Godzilla74

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 10:02:54