【问题标题】:Sorting IPv4 address with port number使用端口号对 IPv4 地址进行排序
【发布时间】:2014-05-14 12:26:42
【问题描述】:

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

 IP = "120.88.66.99:075"

我可以删除 .:

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

这给了我120886699075,但我想将唯一的: 更改为.,所以它给了我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 可能来自同一来源但不同的计算机。

【问题讨论】:

  • 为什么需要对表格进行排序? Lua 表可以用任何你喜欢的东西直接索引。也许你可以问一个单独的问题。
  • 嗯,我有一个 ip 字符串表,它填充了一个 listview 控件,所以我想对表进行升序和降序排序,然后使 listview 控件排序。
  • 请单独提问。
  • 为什么? ip 字符串是一个表格元素的事实是无关紧要的,因为它仍然是一个字符串。
  • 您的编辑只是想解释背景,还是询问如何解决排序问题。如果是后者,如 lhf 所说,请提出一个单独的问题。

标签: string lua lua-patterns


【解决方案1】:

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

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

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


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

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

【讨论】:

    【解决方案2】:

    两者

    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")))
    

    【讨论】:

    • 好评论,但这不是答案,所以不应该在这里发布。
    • @YuHao - 还没有足够的代表来发布 cmets :-)
    • Egor,你能否对你的名字做点什么,以区别于其他拥有 10k 代表的 Egor Skriptunoff:stackoverflow.com/users/1847592/egor-skriptunoff。还是你是同一个人=:P
    • @Schollii - 两个登录都是我的。这是我在工作中使用 SO 的第二次登录。
    猜你喜欢
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 2020-02-17
    • 2015-07-09
    • 2017-12-16
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多