使用端口号对IPv4地址进行排序。

我正在尝试修改一个带有端口号的IP地址字符串,以便对表进行排序,例如IP字符串:

 IP = "120.88.66.99:075"

我可以用以下方式删除'.' 和 ':':

 IP = string.gsub(IP,'%W',"")

这给我 120886699075,但我想把唯一的 ':' 更改为 '.' ,这样它会给我 120886699.075

编辑:

实际上,我想要的并不起作用,因为它没有考虑 '.' 之间的数字数量,所以我想找到一种以给定格式排序 ip 的方法,以便可以对包含原始 ip 字符串的表进行排序。

第二次编辑:

我已经接近完成了:

 function IPToDec(IPs)
  local t = {}
  local f = "(.-)%."
  local l = 1;
  local s, e, c = IPs:find(f,1)
  while s do
    if s ~= 1 or c ~= "" then
     table.insert(t,c)
    end
    l = e+1;
    s, e, c = IPs:find(f,l)
  end
  if l <= #IPs then
    c = IPs:sub(l)
    table.insert(t,c)
  end
  if(#t == 4) then
    return 16777216*t[1] + 65536*t[2] + 256*t[3] + t[4]
  else
    return -1
  end
 end

 IP = "120.88.66.99:075"
 IP = IPToDec(IP:gsub('%:+'..'%w+',""))

但我必须丢失端口才能使排序正常工作,理想情况下,我希望在排序中包括端口号,因为可能有可能来源于同一源但不同的计算机。

点赞
用户1009479
用户1009479

最简单的解决方案是使用两个模式:

IP = IP:gsub("%.", ""):gsub(":", ".")

第一个 gsub. 替换为空字符串,第二个 gsub: 替换为 .


也可以使用一次 gsub 调用。像这样使用辅助表作为第二个参数:

IP = IP:gsub("%W", {["."] = "", [":"] = "."})
2014-05-14 12:30:41
用户3629357
用户3629357
IP1 = "120.88.11.1:075"
IP2 = "120.88.1.11:075"

都将被转换为相同的字符串 12088111.075

这是您真正需要的吗?

可能,您想要以下类型的转换?

IP1 = "120.88.11.1:075" --> 120088011001.075
IP2 = "120.88.1.11:075" --> 120088001011.075

local function IPToDec(IPs)
   -- 返回整数,范围从(-1)到(2^48-1)
   local d1, d2, d3, d4, port = IPs:match'^(%d+)%.(%d+)%.(%d+)%.(%d+):?(%d+)$'
   if d1 then
      port = port == '' and 0 or port
      return (((d1*256+d2)*256+d3)*256+d4)*65536+port
   else
      return -1
   end
end

print(string.format('%.16g',IPToDec("120.88.66.99:075")))
print(string.format('%.16g',IPToDec("120.88.66.99")))
print(string.format('%.16g',IPToDec("not an IP")))
2014-05-14 12:35:26