2010-11-24 14 views
3

Lorsque j'essaie de vérifier si une chaîne est une adresse IPv4 ou non, j'ai découvert que la fonction donne les résultats suivants.isIPv4LiteralAddress a des faux résultats positifs?

144.122.1 -> true

144.122.1.a -> false

144.122.1.333 -> false

Toute idée pourquoi le premier est vrai?

La fonction est: sun.net.util.IPAddressUtil.isIPv4LiteralAddress

+0

En effet. .Net analyse 144.122.1 comme 144.122.0.1 et 144.1 comme 144.0.0.1. Ce serait bien de savoir pourquoi. BTW, vous ne mentionnez pas quelle fonction fait cela. – spender

+0

Le nom de la fonction se trouve dans la légende: isIPv4LiteralAddress. En fait, le paquet est sun.net.util.IPAddressUtil. Merci, je l'ai ajouté à la question. – Huseyin

Répondre

7

Vous pouvez voir pourquoi ils l'ont fait ainsi de lui-même source:

Lorsqu'une adresse en trois parties est spécifiée, la dernière partie est interprété comme un 16- quantité de bit et placé dans le plus à droite de deux octets de l'adresse réseau. Cela rend le format d'adresse en trois parties commode pour spécifier les adresses de réseau de classe B comme 128.net.host.

Donc, il semble que 144.122.1 équivaut à 144.122.0.1.

L'ensemble des commentaires sur le nombre de parties de l'adresse IP textuelle est extrait ci-dessous:

Lorsque seule une partie est donnée, la valeur est stockée directement dans l'adresse de réseau sans réarrangement d'octets.

Lorsqu'une adresse en deux parties est fournie, la dernière partie est interprétée comme une quantité de 24 bits et placée dans le plus à droite de trois octets de l'adresse réseau. Cela rend le format d'adresse en deux parties pratique pour spécifier des adresses réseau de classe A comme net.host.

Lorsqu'une adresse en trois parties est spécifiée, la dernière partie est interprétée comme une quantité de 16 bits et placée dans le plus à droite de deux octets de l'adresse réseau. Cela rend le format d'adresse en trois parties commode pour spécifier les adresses de réseau de classe B comme 128.net.host.

Lorsque quatre parties sont spécifiées, chacune est interprétée comme un octet de données et affectée, de gauche à droite, aux quatre octets d'une adresse IPv4.

2

Ou utilisez une expression régulière, comme indiqué ci-dessous si vous voulez vérifier si les adresses IP sont au format 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()); 
    } 

} 
+0

Ce 'range' _still_ ne semble pas tout à fait correct (bien que ce soit une amélioration par rapport à l'original): il semble interdire 249 par exemple. Devrait-il être quelque chose comme '([0-9] {1,2}) | (1 [0-9] {2}) | (2 [0-4] [0-9]) | (25 [0- 5]) '? Moi-même, j'utiliserais juste [1-9] [0-9] {0,2} 'et je vérifierais la partie supérieure séparément (mais je suis l'école de pensée que les regex sont utiles mais pas nécessaires pour tout). – paxdiablo

+0

Je l'ai édité. Je semble l'avoir passé inaperçu. Je suis désolé. – Ragavan