Ciao a tutti,
sono alle prese con la creazione di un programma che legge in ingresso un indirizzo ipv6 e successivamente dovrebbe filtrarlo in base alla seguente regola: devo accettare solo indirizzi appartenenti all'intervallo 2000::/3 escludendo però alcuni sottocasi come gli indirizzi appartenenti all'intervallo 2001:0000::/23. Di seguito il codice che ho scritto:
public static void main(String[] args){
//Filtro indirizzi ipv6
String[] numeri = args[0].split("\\:");
int primi2b = Integer.parseInt(numeri[0],16);
int secondi2b = Integer.parseInt(numeri[1],16);
//CIDR 2000::/3 da accettare
if ((primi2b & 57344) == 8192){
//Sottocasi da scartare
//CIDR 2001:0::/23
if (((primi2b & 65535) == 8193) && ((secondi2b & 65024) == 0))
System.out.println("SCARTATO");
else
System.out.println("OK");
}
else
System.out.println("SCARTATO");
}
In poche parole effettuo delle split per ottenere l'indirizzo passato come parametro a segmenti di 16 bit ciascuno. Successivamente applico ai primi 16 bit dell'indirizzo una maschera di 16 bit con i primi tre bit impostati a 1 e se il risultato è 8192 (che in esadecimale è 2000) allora sono nel caso corretto, e dovrei applicargli gli altri filtri per scartare gli indirizzo che capitano nel sottocaso 2001:0000::/23 (nel programma i valori sono in formato decimale). Ora, in teoria passando a questo programma l'indirizzo 2001:15::21 dovrebbe farlo passare come buono, in realtà invece viene scartato dall'if annidato. Sapete dirmi il perchè? Forse sbaglio io nell'utilizzare l'and bit a bit...