2014-10-06 3 views
0

Я пытаюсь написать базовую программу на Java, которая проверяет, действителен ли IP-адрес. Я пытаюсь использовать внешние классы, отличные от класса Scanner, а также никаких регулярных выражений.Проверка правильности адреса IPv4

Мой код, доступный на this gist, принимает 4 целых числа в качестве входных данных, по одному для каждого октета. У меня также есть this code, который немного читается, чем первый, но длиннее.

Вопрос в том, есть ли другой способ реализовать эту идею в значительно меньшем числе строк, и если да, то как бы я это выполнил?

+1

Вы можете взять всю строку в, разделить его». ", убедитесь, что длина массива равна 4, а затем петля над каждым элементом массива и подтвердите, что это законный октет. Но в целом, я думаю, вы можете решить свой текущий код, просто цикл 4 раза, и в каждом цикле сканирование октета, проверки и punt, если проверка не выполняется. Удаляет много дубликатов кода. –

+2

Бьюсь об заклад, вы можете использовать цикл for. Кажется, что существует довольно много дублирующего кода, который выглядит аналогичным. – hooknc

+0

Я пытаюсь использовать цикл for, но я застреваю при попытке объявить переменную для каждого октета. Мне понадобится 4 разных переменных (для каждого октета), так как бы объявить их в цикле? – Kootling

ответ

0

только некоторые незначительные улучшения (я думаю, что ваш код выглядит очень хорошо - мой Opinio до сих пор), что, очевидно, читать и все рабочие блоки правильно понять ....

boolean isFailed = false; 
if (first < 0 || first > 255) { 
    System.out.println("Octet 1 is invalid"); 
    isFailed = true; 
} 
if (second < 0 || second > 255) { 
    System.out.println("Octet 2 is invalid"); 
    isFailed = true; 
} 
if (third < 0 || third > 255) { 
    System.out.println("Octet 3 is invalid"); 
    isFailed = true; 
} 
if (fourth < 0 || fourth > 255) { 
    System.out.println("Octet 4 is invalid"); 
    isFailed = true; 
} 

if (!isFailed){ 
    System.out.println("IP Address: " + first + "." + second + "." + third + "." + fourth); 
} 

так я просто инвертировать порядок печати - что экономит вам только то, что большой чек до ...

+0

Я не понимаю, как это отличается от второго опубликованного мной текста ([здесь] (https://gist.github.com/anonymous/1f4ed7b8f5331097ce73)). Разве этот код просто не переключает значения логического в моем исходном коде? – Kootling

+0

он не имеет этой части 'if (first> = 0 && first <= 255 && second> = 0 && second <= 255 && third> = 0 && third <= 255 && 4th> = 0 && 4th <= 255) {... 'который был опубликован в вашем исходном коде https://gist.github.com/anonymous/f0f793f08bc391df8592 ... –

0

ваш подход должен был проверить, может каждый октет ...

вы можете просто сделать это 4 раза или написать метод для этого:

private static boolean check(int octet, int index){ 
    if (0xFF & octet < 256) return true; 
    System.out.println("Octet "+index+" is invalid"; 
    return false; 
} 

и использовать этот метод в основном методе

if (check(first,0) && check (second, 2) && check (third, 3) && check(fourth, 4)){ 
    System.out.println("your ip is valid"); 
} 

примечания - это показывает только первый неверный октет - если вы хотите, чтобы проверить все, что вам нужно другие булево

boolean result = check(first,0) && 
    check (second, 2) && 
    check (third, 3) && 
    check(fourth, 4); //reveals all errors 

совершенно другой подход будет использовать http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html#getByName%28java.lang.String%29

try{ 
    /*InetAdress adress =*/ InetAdress. 
     getByName(""+first+"."+second+"."+third+"."+forth) 
    System.out.println("your ip is valid"); 
}catch (UnknownHostException e){ 
    //TODO represent that error message into a nice expression 
    System.out.println("your ip is invalid"); 
} 

, но это также не предоставляет информацию о том октета, который является недействительным ...

(кстати - что является неправильно с кодом? это нормально!)

1

Хотя этот сегмент кода немного подробный, он прост, самоописателен и оказался плотным.

private static boolean isIPAddressValid(String ip) {  
    boolean result = true; 
    int i = 0; 
    int [] val = new int[4]; 

    if ((ip == null) || (ip.trim().length() == 0)) 
    { 
     //null ip address entered 
     result = false; 
    } 
    else 
    { 
     if (!(ip.contains("."))) 
     { 
      //no '.' found 
      result = false; 
     } 
     else 
     { 
      String [] parts = ip.split("\\."); 
      if (!(parts.length == 4)) 
      { 
       //not 4 quadrants 
       result = false; 
      } 
      else 
      { 
       for (String s : parts) { 
        try { 
         val[i] = Integer.parseInt(s); 
         if ((val[i] < 0) || (val[i] > 255)) 
         { 
          //this quadrant's value exceeds limits 
          result = false; 
         } 
         i++; 
        } catch (Exception e) { 
         //failed to parse quadrant to an integer"); 
         result = false; 
        } 
       } 
      } 
     } 
    } 
    return result; 
} 
0

мне было просто скучно, и написал это регулярное выражение

public static boolean isValid(String ip) { 
    boolean isvalid; 

    isvalid = ip.matches(
      "(([0-9]|[0-9]{0,2}|1[0-9]*{0,2}|2[0-5][0-5]|0{0,3}).){3}" + 
      "([0-9]|[0-9]{0,2}|1[0-9]*{0,2}|2[0-5][0-5]|0{0,3})" 
    ); 

    return isvalid; 
} 

И это был протестирован на следующем наборе:

String[] ips = { 
     "0.0.0.0", 
     "0.111.222.0", 
     "0.0.0.000", 
     "0.00.0.000", 
     "1.1.1.1", 
     "2.2.2.2", 
     "12.13.14.15", 
     "29.29.29.29", 
     "99.99.000.1", 
     "111.102.144.190", 
     "255.255.199.199", 
     "266.255.255.255", //inv 
     "255.265.255.255", //inv 
     "255.255.258.255", //inv 
     "255.255.255.259", //inv 
     "299.100.110.255" //inv 
    }; 
    for (String s : ips) { 
     if (isValid(s) == false) { 
      System.err.println(s + " is invalid"); 
     } 
    } 
Смежные вопросы