isIPv4LiteralAddress имеет ложноположительные результаты? - PullRequest
3 голосов
/ 24 ноября 2010

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

144.122.1 -> верно

144.122.1.a -> false

144.122.1.333 -> false

Есть идеи, почему первое верно?

Функция: sun.net.util.IPAddressUtil.isIPv4LiteralAddress

Ответы [ 2 ]

7 голосов
/ 24 ноября 2010

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

Когда указан адрес из трех частей, последняя часть интерпретируется как 16-битнаяколичество и помещается в самые правые два байта сетевого адреса.Это делает формат адреса из трех частей удобным для указания сетевых адресов класса B как 128.net.host.

Таким образом, похоже, что 144.122.1 соответствует 144.122.0.1.

Полный набор комментариев, касающихся количества частей текстового IP-адреса, приведен ниже:

Если указана только одна часть, значение сохраняется непосредственно в сетевом адресе без перестановки байтов.

Если указан адрес из двух частей, последняя часть интерпретируется как 24-разрядная величина и помещается в самые правые три байта сетевого адреса.Это делает формат адреса из двух частей удобным для указания сетевых адресов класса А. в качестве net.host.

Когда указан адрес из трех частей, последняя часть интерпретируется как 16-битная величина и помещается в самый правый край.два байта сетевого адреса.Это делает формат адреса из трех частей удобным для указания сетевых адресов класса B как 128.net.host.

Когда указаны четыре части, каждая интерпретируется как байт данных и присваивается слева направона четыре байта адреса IPv4.

2 голосов
/ 24 ноября 2010

Или используйте регулярное выражение, как показано ниже, если вы хотите проверить, имеют ли IP-адреса формат 0-255.0-255.0-255.0-255

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author ragavan
 */
public class MatchIPv4Address {
    public static void main(String[] args) {
        String range = "(([01][0-9][0-9])|(2([0-4][0-9]|5[0-5]))|([0-9]?[0-9]))";
        String pattern = range+"\\."+range+"\\."+range+"\\."+range;
        System.out.println(pattern);
        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher("144.229.1.99");
        System.out.println(m.matches());
    }

}
...