2

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

 IP = "120.88.66.99:075"

我可以删除.'s 和:with:

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

这给了我120886699075,但我想将 only 更改:为 a.所以它给了我120886699.075

编辑:

实际上我想要的是不起作用,因为它没有考虑.'s之间的数字数量所以我想要的是一种以给定格式对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 可能来自同一来源但不同的计算机。

4

2 回答 2

3

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

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

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


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

 IP = IP:gsub("%W", {["."] = "", [":"] = "."})
于 2014-05-14T12:30:41.417 回答
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")))
于 2014-05-14T12:35:26.277 回答