Torna indietro   Hardware Upgrade Forum > Software > Programmazione

NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine
NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine
Dopo anni di attesa e una lunga fase di sviluppo, Noctua entra nel mercato dei dissipatori a liquido AIO con la nuova serie NL-LC1. Forte dell'esperienza maturata nel raffreddamento ad aria, l'azienda austriaca promette di portare la propria filosofia fatta di qualità costruttiva, attenzione ai dettagli e silenziosità anche in questo segmento. Abbiamo provato il nuovo sistema per scoprire se riesce a distinguersi in un mercato ormai molto competitivo.
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super
Arrivato sul mercato italiano a fine marzo, la serie Boox Go 10.3 (Gen II) offre Android 15, penna da 4096 livelli e retroilluminazione opzionale (nel modello da noi provato, Lumi, presente). La serie si compone di due tablet ePaper che fanno da e-reader, blocco note digitale e persino browser, tutto a un prezzo che fa dimenticare i prodotti di brand più blasonati
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Pannello QD-OLED da 32 pollici con risoluzione 4K, frequenza di aggiornamento a 240Hz e tempi di risposta rapidissimi: il Gigabyte MO32U24 evolve il progetto del suo predecessore MO32U e alza ulteriormente l'asticella delle prestazioni. È ancora una volta un monitor indirizzato ai giocatori più esigenti
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 10-11-2006, 23:00   #1
karplus
Senior Member
 
L'Avatar di karplus
 
Iscritto dal: Sep 2001
Messaggi: 2282
[java] generare range di ip: capitano ip tronchi

Ciao, sto facendo un programmino per generare tutti gli ip possibili entro certi range che decido direttamente all'interno del programma; tali ip vengno poi riversati in file di testo.

Nella fattispecie il suddetto programma dovrebbe generare tutti gli ip compresi fra 90.117.23.0 e 90.117.29.255.
Se faccio stampare a video i vari ip, l'ultimo ip é effettivamente 90.117.29.255.
Se invece faccio stampare gli in un file di testo, l'ultimo ip risulta essere 90.117.27.18, e quello precedente 90.117.27.188.

Non riesco proprio a capire perchè verso la fine manchino gli ultimi ip. Allargando il range non cambia niente, stesso problema ma con numeri diversi.

Questo é il programma:

Quote:

import java.io.*;

class Range {
public static void main(String args[]) throws IOException {

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pwr = new PrintWriter(new FileWriter("ip.txt"));

int blc,r1=23,r2=29, arr[]=new int [256];

arr[0]=90;
arr[1]=117;

for (int j=0; j<=r2-r1; j++) {
for (int i=1; i<=255; i++) {
pwr.println(arr[0]+"."+arr[1]+"."+(r1+j)+"."+i);
}
}
}
}

Avete idea di come potrei effettivamente risolvere?
Non voglio aggirare il problema tipo allungare di 1 il range, fosse solo x quello mi farei la stampa degli ip con excel. Voglio proprio capire dove sta il problema in un programmino così semplice.

Grazie
__________________

ASUS P8P67 LE 3.0 - Intel® i5 2500 - Corsair XMS3 DDR3 4GBx2 - EVGA GTX760 SC 2Gb - SSD 2.5" 120Gb Ocz Vertex 2E + Seagate 500gb - Corsair 650W V2 - Lcd 23" wide Lg W2361V
karplus è offline   Rispondi citando il messaggio o parte di esso
Old 11-11-2006, 01:36   #2
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
flusha il flusho.

L'ultimo ip che leggi, 90.117.27.18, è un 90.117.27.189 ma la JVM è morta prima che il flusso avesse il tempo di svuotare il suo buffer. E c'erano anche gli altri, in coda.

Quando scrivi su un PrintWriter scrivi su un pezzo di RAM che, eventualmente e per mero accidente, viene riversato, in tutto o in parte, sul disco.

Così una volta che hai finito di scrivere, se vuoi che il contenuto sul file abbia tutti i byte che hai inviato attraverso il PrintWriter, devi "svuotare il PrintWriter" con:

printWriter.flush().

Codice:
import java.io.*; 

class Range {
	public static void main(String args[]) throws IOException {
		PrintWriter pwr = null;
		try {
			pwr = new PrintWriter(new FileWriter("ip.txt"));
		
			int blc,r1=23,r2=29, arr[]=new int [256];
		
			arr[0]=90;
			arr[1]=117;
		
			for (int j=0; j<=r2-r1; j++) {
					for (int i=1; i<=255; i++) {
						pwr.println(arr[0]+"."+arr[1]+"."+(r1+j)+"."+i);
					}
				}
			pwr.flush();
		} finally {
			if(pwr != null) {
				pwr.close();
			}
		}
	}
}
Il finally con il close significa "me possino ammazza', pwr sarà chiuso prima che il metodo main restituisca il controllo". Si chiude lo stesso quando la JVM tira il calzino ma è un evento che, dal punto di vista delle librerie IO che usi, rientra tra i dettagli di uno solo dei molti ambiente JRE con cui il tuo codice è compatibile.

Taccio sulla strada intrapresa per raggiungere lo scopo .
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 11-11-2006, 11:06   #3
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Per generare un range di indirizzi si può anche realizzare una soluzione un pochino più articolata ma più generica.

Ho scritto questa classe:
Codice:
public class InetAddressRangeGenerator
{
    private byte[] from;
    private byte[] to;
    private int length;
    private boolean finished;

    public InetAddressRangeGenerator (InetAddress addrFrom, InetAddress addrTo)
    {
        byte[] fromTmp = addrFrom.getAddress ();
        byte[] toTmp = addrTo.getAddress ();

        if (fromTmp.length != toTmp.length)
            throw new IllegalArgumentException ("Bad addresses");

        from = fromTmp;
        to = toTmp;
        length = from.length;
        finished = false;
    }

    public InetAddress nextAddress ()
    {
        InetAddress addr = null;

        if (!finished)
        {
            int comp = 0;

            for (int i = 0; i < length && comp == 0; i++)
            {
                comp = (from[i] & 0xFF) < (to[i] & 0xFF) ? -1 :
                       (from[i] & 0xFF) > (to[i] & 0xFF) ? +1 : 0;
            }

            if (comp <= 0)
            {
                try {
                    addr = InetAddress.getByAddress (from);
                } catch (UnknownHostException e) { }   // Non dovrebbe accadere

                if (comp < 0)
                {
                    int v, carry = 1;

                    for (int i = length-1; i >= 0; i--)
                    {
                        v = (from[i] & 0xFF) + carry;
                        from[i] = (byte) v;
                        carry = v > 255 ? 1 : 0;
                    }
                }
            }

            if (comp >= 0)
                finished = true;
        }

        return addr;
    }
}
Poi la si usa con:
Codice:
try
{
    InetAddress addrFrom = InetAddress.getByName ("90.117.23.0");
    InetAddress addrTo = InetAddress.getByName ("90.117.29.255");

    InetAddressRangeGenerator rangeGen = new InetAddressRangeGenerator (addrFrom, addrTo);

    InetAddress ad;

    while ((ad = rangeGen.nextAddress ()) != null)
        System.out.println (ad.getHostAddress ());
}
catch (Exception e)
{
    System.out.println (e);
}
In teoria dovrebbe funzionare anche con indirizzi IPv6, io comunque l'ho testata solo con indirizzi IPv4.

Che ne dite???
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 11-11-2006, 11:13   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Quote:
Originariamente inviato da andbin
Che ne dite???
Ne dico tutto il bene possibile .
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 11-11-2006, 15:14   #5
karplus
Senior Member
 
L'Avatar di karplus
 
Iscritto dal: Sep 2001
Messaggi: 2282
Quote:
Originariamente inviato da PGI-Bis
flusha il flusho.

L'ultimo ip che leggi, 90.117.27.18, è un 90.117.27.189 ma la JVM è morta prima che il flusso avesse il tempo di svuotare il suo buffer. E c'erano anche gli altri, in coda.

Quando scrivi su un PrintWriter scrivi su un pezzo di RAM che, eventualmente e per mero accidente, viene riversato, in tutto o in parte, sul disco.

Così una volta che hai finito di scrivere, se vuoi che il contenuto sul file abbia tutti i byte che hai inviato attraverso il PrintWriter, devi "svuotare il PrintWriter" con:

printWriter.flush().


Taccio sulla strada intrapresa per raggiungere lo scopo .
Avevo dimenticato il .flush() e il close(), lol

Ti ringrazio dell'esauriente spiegazione tecnica, ma ora voglio sapere che strada hai intrapreso.


Quote:
Originariamente inviato da andbin
Che ne dite???
Dico che la tua é sicuramente più figa, ma io sono per il codice più stringato possibile.

Però toglimi una curiosità, sta parte proprio non la capisco, me la spiegheresti?

Quote:

for (int i = 0; i < length && comp == 0; i++)
{
comp = (from[i] & 0xFF) < (to[i] & 0xFF) ? -1 :
(from[i] & 0xFF) > (to[i] & 0xFF) ? +1 : 0;
}
__________________

ASUS P8P67 LE 3.0 - Intel® i5 2500 - Corsair XMS3 DDR3 4GBx2 - EVGA GTX760 SC 2Gb - SSD 2.5" 120Gb Ocz Vertex 2E + Seagate 500gb - Corsair 650W V2 - Lcd 23" wide Lg W2361V
karplus è offline   Rispondi citando il messaggio o parte di esso
Old 11-11-2006, 15:25   #6
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Quote:
Originariamente inviato da karplus
... ma ora voglio sapere che strada hai intrapreso.
Taccio nel senso che non dico nulla sul codice perchè ne comprendo la natura sperimentale: è per provare e non mi pare il caso di lanciarsi in disquisizioni stilistiche.

C'è qualche tocco "bizzarre" .

Il tuo arr è un array di 256 interi ma di quei 256 ne usi solo due (il primo e il secondo).

Melius abundare quam deficere?
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 11-11-2006, 15:34   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da karplus
Però toglimi una curiosità, sta parte proprio non la capisco, me la spiegheresti?
Codice:
for (int i = 0; i < length && comp == 0; i++)
{
    comp = (from[i] & 0xFF) < (to[i] & 0xFF) ? -1 :
           (from[i] & 0xFF) > (to[i] & 0xFF) ? +1 : 0;
}
Certo, lo spiego subito.

Quel codice effettua una comparazione tra l'indirizzo contenuto nei bytes in 'from' e quelli in 'to'. La comparazione serve per stabilire se ho raggiunto o meno l'indirizzo 'to'.
L'indirizzo è memorizzato nell'array in "network byte order", ossia il byte più significativo è il primo nell'array. Quindi parto dal primo byte e vado in avanti.
Ho utilizzato l'operatore condizionale ternario, per compattare un po' il codice.

Avrei potuto scrivere la stessa cosa con degli if:
Codice:
if ((from[i] & 0xFF) < (to[i] & 0xFF))
    comp = -1;
else if ((from[i] & 0xFF) > (to[i] & 0xFF))
    comp = +1;
else
    comp = 0;
Più chiaro così??

Appena ottengo un comp diverso da zero, posso uscire dal ciclo, altrimenti continuo il ciclo per verificare i byte man mano meno significativi.

Alla fine posso avere comp = -1, 0 o +1 che mi dice se 'from' è minore, uguale o maggiore di 'to'.

Notare (e questo è importante) la AND con 0xFF. Il byte, in Java, è un tipo di dato con segno. Questo vuol dire che 0xFF è minore di 0x01. Facendo una operazione di AND, non solo porto il byte temporaneamente a 'int' ma lo tronco per evitare l'estensione di segno, avendo così un valore 0...255.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 11-11-2006, 17:13   #8
karplus
Senior Member
 
L'Avatar di karplus
 
Iscritto dal: Sep 2001
Messaggi: 2282
Quote:
Originariamente inviato da PGI-Bis
Taccio nel senso che non dico nulla sul codice perchè ne comprendo la natura sperimentale: è per provare e non mi pare il caso di lanciarsi in disquisizioni stilistiche.

C'è qualche tocco "bizzarre" .

Il tuo arr è un array di 256 interi ma di quei 256 ne usi solo due (il primo e il secondo).

Melius abundare quam deficere?
Esatto, nella versione di prova é meglio stare larghi con la dimensione degli array

Teoricamente dovrebbe servire a incamerare i 4 blocchi dell'ip, perchè abbia scelto 256 resta un mistero cmq



Thx ad andbin per la spiegazione, me la devo leggere ben bene perchè 0xFF manco sapeva che si poteva usare
__________________

ASUS P8P67 LE 3.0 - Intel® i5 2500 - Corsair XMS3 DDR3 4GBx2 - EVGA GTX760 SC 2Gb - SSD 2.5" 120Gb Ocz Vertex 2E + Seagate 500gb - Corsair 650W V2 - Lcd 23" wide Lg W2361V
karplus è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


NL-LC1 è il primo dissipatore a liquido AIO di Noctua: silenzio è la parola d'ordine NL-LC1 è il primo dissipatore a liquido A...
Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con Android 15 e penna, dal prezzo super Boox Go 10.3 (Gen II) Lumi: il tablet e-ink con ...
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming Gigabyte MO32U24 OLED: il 4K a 240Hz su un panne...
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh Recensione realme 16 5G: lo smartphone con Selfi...
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni Come rispettare tutte le nuove regole per i mono...
Intel 18A-P è già in fase ...
Logitech G305 Lightspeed e G316 X 98: 8....
Qualcomm Snapdragon Reality Elite uffici...
Snapdragon START: arriva la piattaforma ...
Kioxia Exceria G3: il modella da 4 TB &e...
Gemini 3.5 Flash delude nei test Android...
DREAME X50 Ultra Complete a 749€ per il ...
Prezzi console handheld alle stelle: la ...
Toyota presenta il primo pickup elettric...
Prime Day anticipato, tutti gli smartpho...
Dyson V10 Konical: il primo aspirapolver...
FSR 4.1 su Radeon 6000, AMD spiega perch...
Hisense svela la gamma TV 2026: RGB Mini...
Narwal lancia gli sconti Prime Day 2026:...
SpaceX ha comprato Cursor: accordo da 60...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 04:57.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v