2014-05-14 2 views
2

Я пытаюсь изменить IP-адрес строку, которая имеет номер порта в нем так, чтобы отсортировать таблицу, пример IP строки:Сортировка IPv4 адрес с номером порта

IP = "120.88.66.99:075" 

я могу удалить . ' s и : с:

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

и это дает мне 120886699075, но я хотел бы изменить только : к . так что это дает мне 120886699.075

Edit:.

На самом деле то, что я хотел не работает, так как не принять во внимание количество цифр между так что я woulds нравится способ сортировки внутрибрюшинно в данном формате, таблица, содержащую исходную строку ip, может быть отсортирована.

Edit 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-адреса поступают из одного источника, но с разных компьютеров.

+0

Зачем вам нужно, чтобы отсортировать таблицу? Таблицы Lua могут быть проиндексированы непосредственно с чем угодно. Возможно, вы можете задать отдельный вопрос. – lhf

+0

Ну, у меня есть таблица ip-строк, которая заполняет элемент управления listview, поэтому я хочу отсортировать таблицу по возрастанию и убыванию, чтобы затем отсортировать элемент управления listview. –

+2

Пожалуйста, задайте отдельный вопрос. – lhf

ответ

3

Самое простое решение заключается в использовании двух моделей:

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

Первый gsub заменяет . с пустой строкой, второй заменяет : на .


Используя один вызов gsub также возможно. Используйте вспомогательную таблицу в качестве второго аргумента, как это:

IP = IP:gsub("%W", {["."] = "", [":"] = "."}) 
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"))) 
+0

no lol, Ive только что отредактировал первое сообщение. –

+0

Хороший комментарий, но это не ответ, поэтому он не должен быть размещен здесь. –

+0

@YuHao - Не хватило репутации, чтобы оставлять комментарии :-) –

 Смежные вопросы

  • Нет связанных вопросов^_^