Operatore bit a bit

di il
4 risposte

Operatore bit a bit

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...

4 Risposte

  • Re: Operatore bit a bit

    Mi sono appena reso conto di aver fatto un errore di valutazione. Il programma è corretto
  • Re: Operatore bit a bit

    DanPir ha scritto:


    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:
    Alt! Attenzione. Un conto è se vuoi parsare una forma tipo "2001:0000::/23". Questo NON è un indirizzo IP puro. Si chiama CIDR notation e serve per rappresentare un IP e la sua "routing prefix". Un altro conto è se vuoi parsare un IP (v6) vero e proprio. Solo che .... ci sono diverse varianti e abbreviazioni possibili per gli IPv6 che rendono il parsing non "banale".
    Quindi, consiglio: usa le classi nel package java.net per "parsare" la stringa di un IP. Una volta che hai l'array di byte del IP ... beh, un masking dell'indirizzo è abbastanza basilare da fare.
  • Re: Operatore bit a bit

    Grazie mille, andrò a dare un occhiata al package java.net sperando di trovare un modo migliore per "parsare" l'indirizzo ipv6. Anche se comunque a prima vista dovrebbe mancare solo la gestione nel caso l'indirizzo ip sia rappresentato con il metodo della compressione degli zeri.
  • Re: Operatore bit a bit

    DanPir ha scritto:


    dovrebbe mancare solo la gestione nel caso l'indirizzo ip sia rappresentato con il metodo della compressione degli zeri.
    Guarda che, detto in generale, è un pelino più complicato. Leggi il javadoc di java.net.Inet6Address
Devi accedere o registrarti per scrivere nel forum
4 risposte