2012-04-10 4 views
3

Что является самым простым способом в Java 6 определить, является ли данный адрес действительной маской сети? Я нашел одно решение, которое в основном создает массив действительных IP-адресов для сравнения (т. Е. «255.255.255.255», «255.255.255.254», «255.255.255.252» и т. Д.). Есть ли более простой способ или это лучший способ?Определить, действительна ли маска сети в Java

+0

Вы ищете какой-либо действующий IP-адрес или есть набор IP-адресов, которые вы хотите проверить? Любой допустимый IP (как String) будет состоять из 4 чисел, разделенных символом '.' со значением между (включенным)' 0' и '255', который вы можете проверить для этого случая. В качестве числа ip должно быть между 0 и 2^32-1. – twain249

ответ

4

Если вы счастливы включить внешнюю зависимость, то в Apache commons.net может иметь то, что вы ищете.

Посмотрите на и его SubnetInfo вложенный класс. Вы можете построить SubnetUtils с IP-адресом и маской. constructor выдает исключение, если ваша маска недопустима, а SubnetInfo.html#isInRange может рассказать вам, находится ли IP в диапазоне маски.

+0

Очень приятно. У меня нет ограничений или ограничений для внешних зависимостей. – wxkevin

+0

Этот вопрос пару лет назад, поэтому этот комментарий может быть недействительным, но я пробовал эксперимент с умышленным использованием искаженной сетевой маски (по крайней мере, я думал, что это было неверно: 205.0.0.0). Я не получил исключение из конструктора, но я смог использовать некоторые инструменты в SubnetInfo, чтобы хотя бы обнаружить проблему. – Rich

4

Что об этом псевдокоде:

function IS_VALID(MASK) 
    boolean zeroStart = false 
    for each byte in MASK 
    for each bit 
     if bit = 1 and zeroStart = false 
     continue 
     if bit = 1 and zeroStart = true 
     return INVALID_MASK 
     if bit = 0 and zeroStart = false 
     zeroStart = true 
     if bit = 0 and zeroStart = true 
     continue 
    return VALID_MASK 
+0

Выглядит хорошо, поскольку псевдокод идет. – wxkevin

0

Вы можете попробовать использовать регулярное выражение

Pattern p = Pattern.compile("^((2[0-5][0-5]|1[\\d][\\d]|[\\d][\\d]|[\\d])\\.){3}(2[0-5][0-5]|1[\\d][\\d]|[\\d][\\d]|[\\d])$"); 
String ip = "255.255.255.0.2"; 
Matcher m = p.matcher(ip); 
if(m.matches()) { 
    //valid 
} 
+0

Я не думаю, что 255.255.255.1 является действительной сеткой маски –

+0

Это похоже на регулярное выражение для любого действительного IP-адреса. Я искал что-то, что следует правилам для сетевых масок. – wxkevin

1

Я думаю, ответ Serg10 является самым простым.

Если вам нужно избегать внешних зависимостей, то вы должны использовать Inet4Address для преобразования IP-адреса String в массив байтов, а затем проанализировать байты. Попытка проанализировать строку с помощью регулярных выражений или путем сравнения с фиксированным набором строк обязан дать неправильный ответ:

  • Компоненты IP-адреса могут иметь ведущие нули.
  • IP-адрес также может быть записан тремя, двумя или даже одним компонентом.

Обратитесь к Inet4Address javadoc за описанием того, как может выглядеть строка IP-адреса.

+0

Спасибо за альтернативу внешней зависимости. Я в порядке с внешней зависимостью, но я уверен, что будут другие, которые найдут свой путь путем поиска здесь, кто не будет или не сможет использовать внешнюю зависимость. – wxkevin

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