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

时间:2014-05-14 12:26:42

标签: string lua lua-patterns

我正在尝试更改其中包含端口号的IP地址字符串,以便对表进行排序,这是一个示例IP字符串:

 IP = "120.88.66.99:075"

我可以删除.:

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

这给了我120886699075,但我想将:更改为.,因此它会给我120886699.075

编辑:

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

编辑2:

我有这个几乎与此有关:

 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+',""))

但我不得不松开端口以使其正确排序,理想情况下我想在排序中包含端口号,因为ip可能来自相同的来源但不同的计算机。 / p>

2 个答案:

答案 0 :(得分:3)

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

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

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


也可以使用一次gsub来电。使用辅助表作为第二个参数,如下所示:

 IP = IP:gsub("%W", {["."] = "", [":"] = "."})

答案 1 :(得分:1)

两个

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)
   -- returns integer from (-1) to (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")))